cron 作业执行脚本

cron 作业执行脚本

我已经创建了一个在 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 配置和当前目录、当前用户、环境等详细信息都是您应该在问题中指定的。但如果您这样做了,您可能会自己找到答案。

相关内容