Cronjob 的不同行为

Cronjob 的不同行为

我按照以下方式创建了一个 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命令即将被淘汰,并被等效的 取代systemdsystemctl您可以systemctl start $service在终端命令中执行此操作。即使没有sudosystemctl也会确定它不是以 root 身份运行,并要求您输入sudo密码。

在 crontab 中,您将使用systemctl实用程序的完整路径,即/bin/systemctl

因此,如果你使用

/bin/systemctl start $service

它应该可以工作。

相关内容