如果之前有人问过这个问题,我很抱歉,但我不知道如何对此提出搜索查询。我对 Linux 非常陌生,我一直在学习解决问题。
我正在尝试设置运行的 cron 作业来重新启动我正在运行的游戏服务器。
目前我的 crontab 看起来像这样
#backup world as instructed by https://github.com/g1franc/SEDS-Setup
0 0 * * * /home/root/spaceengineers/start.sh backupworld
#close server
1 0 * * * /usr/bin/screen -S spaceengineers -X stuff "^C"
#close screen
2 0 * * * /usr/bin/screen -S spaceengineers -X stuff "^M"
#recreate server
3 0 * * * /home/root/spaceengineers/start.sh
现在在备份世界中,我进入位于/var/log
i get 的系统日志文件
May 24 00:00:01 SpaceEngineers CRON[1958]: (root) CMD (/home/root/spaceengineers/start.sh backupworld)
May 24 00:00:01 SpaceEngineers CRON[1957]: (CRON) info (No MTA installed, discarding output)
这与重新创建服务器也是一样的
May 24 00:03:01 SpaceEngineers CRON[2269]: (root) CMD (/home/root/spaceengineers/start.sh /usr/bin/screen -x spaceengineers)
May 24 00:03:01 SpaceEngineers CRON[2268]: (CRON) info (No MTA installed, discarding output)
其余命令运行良好。
现在,在有人质疑我为什么以这种方式构建代码之前,这是因为我所遵循的教程说通过启动服务器,~/spaceengineers/start.sh -x spaceengineers
并且从我所读的内容来看,我需要执行 /usr/bin/screen 才能访问 Cron 中的任何屏幕命令
我做错了什么以及我需要做什么来纠正我的问题。
編輯:更改了 crontab 以匹配我服务器上的当前内容,问题仍然存在
start.sh 的 Pastebin
答案1
您能检查一下此行的 GNU 屏幕语法吗:
3 0 * * * /home/root/spaceengineers/start.sh /usr/bin/screen -x spaceengineers
我本来期望的是这样的:
3 0 * * * /usr/bin/screen -S spaceengineers -X stuff 'command with newline'
但是,使用该-X
方法screen
需要屏幕命令而不是运行脚本。
因此您需要screen
stuff
按照此命令使用SU 问题
screen -S sessionname -X stuff 'command'`echo -ne '\015'`
更新
尝试/bin/bash
或您使用的 Shell 所在的任何地方。
3 0 * * * /bin/bash /home/root/spaceengineers/start.sh
也许添加内容来start.sh
帮助调试。
您可以使用以下which
命令查找 shell。可能必须sudo
成为 root 才能找到。
答案2
这个命令对我有用,但是因为我的脚本中的一个或多个命令需要 sudo,所以我必须在 root 用户的 cron 下进行设置:
17 2 29 1 * /usr/bin/screen -dmS $MYSESSIONNAME /bin/bash $FULLPATHTOMYSHELLSCRIPT $SHELLSCRIPTARG1 $SHELLSCRIPTARG2 ...
让屏幕工作(而不是在由 cron 调用时立即关闭)的关键是参数-d
,但m
可能在某种程度上/情况下也有帮助。
screen --help
以下是输出中的相关片段
-dmS name
作为守护进程启动:屏幕会话处于分离模式。”
答案3
@daily /usr/bin/screen -dms aquaticscenery /ig.py && python ig.py