我创建了一个 Cron 作业来运行一个脚本,该脚本检查某个进程是否正在运行,如果运行,则打印出该进程正在运行,如果没有运行,则打印出该进程未运行并重新启动该进程:
#!/bin/sh
SERVICE="start_server.py"
if ps -ef | grep "$SERVICE" | grep -v grep >/dev/null
then
echo "start_server.py is running"
else
echo "start_server.py stopped"
python2.7 start_server.py &
fi
以 Ubuntu 用户身份运行以下命令创建了以下 cron 任务:crontab -e
* * * * * /home/ubuntu/mislaka/check_process.sh 2>&1 /home/ubuntu/mislaka/script_log.log
由于某种原因,它无法工作或将输出写入日志文件。
尝试重新启动 cron 服务,尝试以 root 身份创建 cron 作业,更改所有权限和运行脚本的用户,但没有任何效果。
如果我单独运行该脚本,它将按预期工作。
Ubuntu 版本:
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.2 LTS
Release: 20.04
Codename: focal
提前致谢
答案1
通过 运行的作业cron
或systemd
启动脚本不会在与桌面相同的运行时环境中运行。systemd
启动脚本以 运行root
。您的任何PATH
更改或其他环境变量设置都不会自动传播到您的cron
作业。例如,没有$DISPLAY
,因此 GUI 程序需要特殊处理(阅读man xhost
)。
cron
人们可以在crontab
文件 Read中为所有作业设置环境变量man 5 crontab
。
echo "=== id ===";id;echo "=== set ===";set;echo "=== env ===";env | sort;echo "=== alias ===";alias
查看每个环境中的结果 。
由于command
该行的一部分crontab
默认由 解释/bin/sh
,其语法比 更简单/bin/bash
,因此我建议command
调用一个bash
脚本(可执行、已安装、以 开头#!/bin/bash
)来设置环境,然后调用所需的程序。
答案2
问题是我需要更改我的脚本并编辑 cron 作业以运行正确的脚本并添加脚本的完整路径。
答案3
你可以这样检查:
第一次运行
service cron status
来检查状态。每分钟向 mycommand.log 文件写入测试字符串以检查 cron 是否正常工作。
运行crontab -e
并在末尾添加以下内容:*/1 * * * * echo test > /tmp/mycommand.log 2>&1
保存并关闭然后检查 /tmp/mycommand.log 文件中的内容。更改时间或时区后,重新启动 cron 服务,以确保 cron 按时运行。运行
service cron restart