tl; dr: 今天用 screen -dmS 代替了原来的手动启动服务。

起因

KEEER 的有些服务需要手动与之交互以 debug,而它们一旦用 /etc/rc*.d/S99whatever 启动,就只有 log,不能连接到 terminal。于是最开始我们用 xrdp 连到图形界面,但是有一天套路云客服给我打电话说内存占用率到了 70% 多,top 一看完全是 Xorg 的锅。遂弃用此方法。后来都是用 screen 手动启动一切。但是一重启就完了。

screen -dmS

自带 help 里给的信息如下:

$ screen --help
......
Options:
......
-dmS name     Start as daemon: Screen session in detached mode.
......
-s shell      Shell to execute rather than $SHELL.
......

一看,这两者结合不是正好满足要求吗?

实现

  1. 创建文件夹 /path/to/services/
  2. 对于每个服务,写一个启动脚本(注意是以 root 执行的,故不能用 ~ 之类的操作,比如:
    cd /path/to/some/service/
    su username -c "npm run start"
  3. 创建 /etc/init.d/keeer-services,如下内容:
    for service in `ls /path/to/services`;
    do screen -dmS $service -s /path/to/services/$service;
    done;
  4. 用 root 把文件 link 过去:
    for d in /etc/rc*.d;
    do ln -s /etc/init.d/keeer-services $d/S99keeer-services;
    done;
  5. 用 root加上可执行权限: chmod +x /etc/init.d/keeer-services
  6. 重启: sudo reboot

总结

中间漏了一大堆步骤,导致 reboot 了好多次才搞定,导致服务中断。这是由于我们测试服还没搭好(没错,我们还在用生产服跑测试)。