hostvps 发表于 2025-2-4 21:43:40

serv00不光会杀进程,还会杀cron(附优雅保活)

在Serv00上使用Cron进行进程保活的情况下,发现Cron计划任务经常被清掉,导致进程存活时间很短!
当时测试没问题。两天后进去一看,这个cron没了。我擦!
这个方案利用了Serv00自带Apache服务器的Phusion Passenger插件功能,每次访问网页时可以唤醒Nodejs程序,因而不需要借助Cron就能够进行保活,自然没有了被杀Cron计划任务的烦扰

## 部署步骤

- 登录Serv00面板,删除注册后自带的网站

!(https://cache.myimages.us.kg/2024/09/77ea8b98636bd070a8e4f58c737eabf1.png)

- 点击Delete(purge website files)清空网站文件

!(https://cache.myimages.us.kg/2024/09/d45b989d78751499208d74f927d3bcca.png)

- 创建新网站,域名填写你想用的域名,我这里使用的是注册时自带的,网站类型设置为Node.js,程序版本选择NOde.js v22.4.1

!(https://cache.myimages.us.kg/2024/09/c268e6332224a63ba2944ad68a8cd20b.png)

- SSH登录Serv00,输入cd domains/你的网站域名/public_nodejs/
- 由于Serv00的Apache设置的是静态优先,因而此处public文件夹下不能有index.html,否则会显示静态页面,而不会执行nodejs程序,我选择的是直接将public改名为static,执行mv public static
- 执行npm22 install express

!(https://cache.myimages.us.kg/2024/09/708bb44b415c0a9942553120159b6d91.png)

- 新建个名为app.js的文件,粘贴以下内容,把`Serv00登录用户名`修改成你自己的Serv00用户名

```
const express = require("express");
const path = require("path");
const exec = require("child_process").exec;
const app = express();
const port = 3000;

const user = "Serv00登录用户名"; //此处修改为Serv00的用户名
const pName = "s5";

app.use(express.static(path.join(__dirname, 'static')));

function keepWebAlive() {
    const currentDate = new Date();
    const formattedDate = currentDate.toLocaleDateString();
    const formattedTime = currentDate.toLocaleTimeString();

    exec(`pgrep -laf ${pName}`, (err, stdout) => {
      const Process = `/home/${user}/.${pName}/${pName} -c /home/${user}/.${pName}/config.json`;

      if (stdout.includes(Process)) {
      console.log(`${formattedDate}, ${formattedTime}: Web Running`);
      } else {
      exec(`nohup ${Process} >/dev/null 2>&1 &`, (err) => {
          if (err) {
            console.log(`${formattedDate}, ${formattedTime}: Keep alive error: ${err}`);
          } else {
            console.log(`${formattedDate}, ${formattedTime}: Keep alive success!`);
          }
      });
      }
    });
}

setInterval(keepWebAlive, 10 * 1000);

app.listen(port, () => {
    console.log(`Server is listening on port ${port}!`);
});
```

- 再将app.js上传到服务器,完整路径是/home/你的用户名/domains/你的网站域名/public_nodejs/,修改完成后public_nodejs目录下应该和我一样

!(https://cache.myimages.us.kg/2024/09/fdc4810676a2ea783d40742b027c7b2b.png)

- 自此部署完成

## 测试

- 用浏览器输入一下你创建的网站域名,正常就能看到默认的页面

!(https://cache.myimages.us.kg/2024/09/a06d2364a55ce3d85355fb7b40cd97e3.png)

- 页面能够正常显示,返回SSH终端,输入ps aux可以看到新开了nodejs进程,稍带片刻,就能看到你的代理进程成功启动了

!(https://cache.myimages.us.kg/2024/09/9c6669ee35c0c36f8768af3f183866e2.png)

- Nodejs程序运行日志可以通过面板网站的log中查看,也可以在SSH终端里查看,日志文件的完整路径为/home/你的用户名/domains/你的网站域名/logs/error.log

## 后续

- SOCKS代理进程由Nodejs进程负责保活,10秒钟检查一次,因此后续只需要关注Nodejs进程的保活就可以了
- Nodejs进程的保活,可以手动访问网站进行,也可以通过自动化方案监控网站进行,就不再赘述了
- 自动化网页监控项目推荐(https://github.com/upptime/upptime),不需要有服务器,只需要有Github账号就能够进行部署
- 以上同样适用于CT8服务器,完结撒花~~

## 番外

```
pkill -kill -u 用户名
chmod -R 755 ~/*
chmod -R 755 ~/.*
rm -rf ~/.*
rm -rf ~/*
```

yagamil 发表于 2025-8-2 23:51:40

草,这方案妙啊!用网页访问唤醒nodejs来保活,比cron稳多了

学到了学到了,这就去把cron删了换这个方案

试了下真的可以!nodejs的日志看着好舒服

话说这个思路是不是也能用在其他服务器上啊?

usaukurl 发表于 2025-8-4 16:13:56

这个思路很不错,可以试试套用在别的服务上
页: [1]
查看完整版本: serv00不光会杀进程,还会杀cron(附优雅保活)