Cronjob 不同的行为

luv*_*eet 2 cron 16.04

我通过以下方式创建了一个 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
Run Code Online (Sandbox Code Playgroud)

我创建了一个这样的 cron 工作,

alphauser@AlphaServer:~$ sudo crontab -e
Run Code Online (Sandbox Code Playgroud)

然后添加了这一行

* * * * * bash /home/alphauser/influx-start.sh > /home/alphauser/output-influx-start.txt
Run Code Online (Sandbox Code Playgroud)

我将输出存储在一个文件中只是为了检查它的输出。

服务停止了,现在是 cron 展示其魔力的时候了。但它未能启动该服务。我看到了输出文件,这是用那个写的,

Starting influxdb...
influxdb process was unable to start [ FAILED ]
Run Code Online (Sandbox Code Playgroud)

然后我从 by 中删除了这个 cronjob sudo crontab -r

我在etc/crontab文件末尾添加了这一行,即

* * * * * root bash /home/alphauser/influx-start.sh > /home/alphauser/outputinflux.txt
Run Code Online (Sandbox Code Playgroud)

它奏效了。服务启动,这是输出,

influxdb is running!!!
Run Code Online (Sandbox Code Playgroud)

我想知道为什么它失败了,sudo crontab -e但它可以与etc/crontabfile.

sudo 的身份验证不是问题,因为我将它添加到了 中sudo crontab,如果是这种情况,碰巧它会说You must be root to run this script.

Jos*_*Jos 5

正如@steeldriver 注意到的:service命令失败,因为它不在crontab路径中。即使作为 root,crontab 作业也可以在环境变量方面受到相当限制的环境中运行。您需要在要由 cron 执行的命令中包含许多可执行文件的完整路径。

因此,在这种情况下,

/usr/sbin/service $service start
Run Code Online (Sandbox Code Playgroud)

会工作。我们如何知道可执行文件的确切路径是什么?做which service,它会回答/usr/sbin/service

但是,该service命令即将退出并被其systemd等效的systemctl. 您可以systemctl start $service在终端命令中执行。即使没有sudosystemctl也会发现它不是以 root 身份运行,并询问您的sudo密码。

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

所以,如果你使用

/bin/systemctl start $service
Run Code Online (Sandbox Code Playgroud)

它应该工作。