我已经创建了一个在 shell 中按预期工作的脚本,但 cron 作业似乎没有运行它。当我检查我的 cron 邮件时,我看到它打印“hltv 未运行”但没有创建屏幕会话。
#!/bin/bash
if [[ $(netstat -a | grep '27027') == *27027* ]]; then
echo "tour 2 hltv is running"
else
echo "hltv is not running"
/usr/bin/screen -A -m -d -S tour2 ./start_hltv +connect xxx.xxx.xx.xx:27015 -port 27027 +exec hltv.cfg
fi
出于隐私原因,我已将我的 IP 替换为 xx.xxx.xx.xxx。
更多详细信息...好吧,我有一个 centos vps,用于 hltv(与半条命游戏相关),它在端口 27027 上运行。每隔一段时间,它就会崩溃,所以我试图创建一个脚本来检查该端口上是否发生了什么事情,如果没有,则意味着进程崩溃了,需要启动它。
我创建了脚本并将其命名为“autorestart”并运行
chmod +x autorestart
这是我从 cron 作业邮件中获得的输出,但屏幕 -ls 没有显示 tour2 作为有效屏幕。
消息 ID:<[电子邮件保护]> 日期:2014 年 3 月 29 日星期六 22:17:01 -0400 (EDT)
hltv 未运行
谢谢
编辑。已成功。
#!/bin/bash
if [[ $(netstat -a | grep '27027') == *27027* ]]; then
echo "tour 2 hltv is running"
else
echo "hltv is not running"
cd /usr/hlds/tour2
chmod +x ./run_hltv (run_hltv has screen command)
sh run_hltv
答案1
您的脚本本身看起来不错,只是您使用了启动脚本的相对路径(./start_hltv
)。默认情况下,在 CentOS 机器上,crontab 从文件系统根目录运行/
,这是通过以下行完成的:
HOME=/
为了保证您现在和将来的所有 cronjobs 都能顺利运行,我建议不要更改此行。相反,只需在脚本中使用完整路径即可。因此,请用./start_hltv
其完整路径替换:/usr/hlds/tour2/start_hltv
。
您可能还需要用+exec hltv.cfg
完整路径替换,以便它变成+exec /usr/hlds/tour2/hltv.cfg
。
答案2
... 正如 Oldskool 所说,您必须指定 cron 的路径,然后尝试使用 chmod 755 scriptfile 使脚本可执行。或者在 cron 中指定 bash 路径。例如,我让 raspberry pi 闹钟脚本每天在特定时间执行。该脚本是用 python 编写的,所以我在 cron 中执行的操作是这样的
25 7 * * * python /home/scriptfolder/clock.py
每天早上 7:25 这个脚本都会被执行...因为你已经在脚本中指定了要使用的解释器的路径,你只需要像这样放在 cron 中
* * * * * bash /path/to/script/file
或者
* * * * * /path/to/script/file.sh
但这里你必须使脚本可执行
答案3
很明显,您的自动重启脚本是由 cron 运行的(因为您收到电子邮件说“hltv 未运行”)。如果 screen 本身出现故障,我希望在同一条消息中看到错误消息。这表明 screen 成功启动,但很快就死机了。您是否尝试过向 screen 添加 -L 选项以便记录输出?
/usr/bin/screen -L -A -m -d -S tour2 ./start_hltv +connect xxx.xxx.xx.xx:27015 -port 27027 +exec hltv.cfg
输出应出现在 $HOME/screenlog.0 中。您可能不希望它一直处于打开状态,但它可能有助于显示失败的原因。
答案4
我认为,在通过 cron 或任何其他方式运行的脚本中,相对路径和/或直接名称是可以的。您只需要确保当前目录和环境正确。对于直接命令名称,您只需要PATH
相应地设置变量,对于相对名称,您需要更改目录。最好在脚本开始时执行这两个步骤。
脚本的输出包含在邮件中,这意味着它已经由 cron 运行。 (IvanAK 的回答在这里似乎没用。Paul 的回答可能会对屏幕有所帮助。)
虽然 Oldskool 可以解决将所有路径切换为绝对路径的问题,但我只会在开始时修复环境和当前目录。
#!/bin/bash
cd /path/where/you/run/it/successfully
...
cron 配置和当前目录、当前用户、环境等详细信息都是您应该在问题中指定的。但如果您这样做了,您可能会自己找到答案。