我正在尝试使用以下命令作为 cron 项来设置在启动期间启动的多个进程(游戏服务器):
@reboot /usr/bin/screen -fa -d -m -S NAME COMMAND
但是,如果服务器因某种原因崩溃,屏幕关闭,并且服务器没有机会运行,它就会自动重启(据我所知;屏幕在套接字中看不到任何进程,因此关闭)。
有没有办法可以解决这个问题,这样即使没有运行任何程序,屏幕也会停留在那里?比如打开一个 shell?
答案1
给出的命令是屏幕的子命令,因此当它退出时,窗口就死了。
您可以通过启动 shell 然后将输入推送到窗口来运行命令来解决此问题,但这只会改变问题,以便您只剩下一个挥之不去的 shell 提示符,并且服务器不会自动重启。
实际上,你想运行一个 keep-alive 命令,它然后运行您感兴趣的服务器。有很多工具,但最简单的是自己在 shell 中编写一些东西(除非您想要专用工具的全部功能)。
#!/bin/sh
while [ ! -f /home/servicename/shutdown-flagfile ]; do
echo "Starting server [$(date)]"
server-binary-name "$@"
sleep 1
done
第 2 行允许您通过创建一个特殊文件(使用“touch”)来跳出循环,server-binary-name 是真正要运行的程序,“$@”用于传递调用包装器的选项,sleep 1 是为了如果服务器在启动时死机,您不会因为每秒数千次重复重新启动而消耗所有的 CPU,这样就很难进入并查看发生了什么。echo 行只是让您看到服务器上次必须重新启动的时间。