我按照以下方式创建了一个 cronjob 来运行脚本。该脚本仅在服务关闭时才启动服务。
这是脚本,
#!/bin/bash
service=influxdb
if (( $(ps -ef | grep -v grep | grep $service | wc -l) > 0 ))
then
echo "$service is running!!!"
else
service $service start
fi
我创建了一个这样的 cron 任务,
alphauser@AlphaServer:~$ sudo crontab -e
然后添加这一行
* * * * * bash /home/alphauser/influx-start.sh > /home/alphauser/output-influx-start.txt
我将输出存储在一个文件中只是为了检查其输出。
服务停止了,现在是 cron 展示其魔力的时候了。但它无法启动服务。我看到了输出文件,其中写了以下内容:
Starting influxdb...
influxdb process was unable to start [ FAILED ]
然后我从中删除了这个 cronjob sudo crontab -r
。
我在文件末尾添加了这一行etc/crontab
,即
* * * * * root bash /home/alphauser/influx-start.sh > /home/alphauser/outputinflux.txt
并且成功了。服务启动了,输出如下,
influxdb is running!!!
我想知道为什么它失败了sudo crontab -e
但是它可以与etc/crontab
文件一起工作。
sudo 的身份验证不可能是问题,因为我将其添加到了中,sudo crontab
并且如果碰巧是这种情况,它会说You must be root to run this script
。
答案1
正如@steeldriver 注意到的:该service
命令失败,因为它不在crontab
路径中。即使以 root 身份运行,crontab 作业也会在环境变量方面受到严格限制的环境中运行。您需要在 cron 要执行的命令中包含许多可执行文件的完整路径。
因此,在这种情况下,
/usr/sbin/service $service start
应该可以。我们如何知道可执行文件的确切路径?照做which service
,它就会回答/usr/sbin/service
。
但是,该service
命令即将被淘汰,并被等效的 取代systemd
。systemctl
您可以systemctl start $service
在终端命令中执行此操作。即使没有sudo
,systemctl
也会确定它不是以 root 身份运行,并要求您输入sudo
密码。
在 crontab 中,您将使用systemctl
实用程序的完整路径,即/bin/systemctl
。
因此,如果你使用
/bin/systemctl start $service
它应该可以工作。