我通过以下方式创建了一个 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.
正如@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在终端命令中执行。即使没有sudo,systemctl也会发现它不是以 root 身份运行,并询问您的sudo密码。
在 crontab 中,您将使用systemctl实用程序的完整路径,即/bin/systemctl.
所以,如果你使用
/bin/systemctl start $service
Run Code Online (Sandbox Code Playgroud)
它应该工作。
| 归档时间: |
|
| 查看次数: |
256 次 |
| 最近记录: |