我已经看过很多次(1 , 2)这个问题,但我没有找到答案,所以我开始了。
我正在运行Debian 11,但我想它对于任何类似 Debian 的发行版都一样。
我的crontab -e
样子:
...
@reboot sleep 20 && /opt/isPromscaleOnOrOff.sh
...
和内容isPromscaleOnOrOff.sh
:
#!/bin/bash
SERVICE="promscale"
if pgrep -x "$SERVICE" >/dev/null
then
echo "$SERVICE is running"
else
echo "$SERVICE is stopped, I will run it now"
nohup promscale --db-name asdf1234--db-password asdf1234 --db-user asdf1234 --db-ssl-mode allow --install-extensions & >> /dev/null
disown
fi
但是当我重新启动虚拟机时,脚本没有运行,/var/log/syslog中的 cron 日志显示启动脚本的 crontab。
我想要实现的目标可以很容易地完成进程的守护进程(我确实做到了),我只是想知道为什么 crontab 不启动我的脚本。
运行的作业
cron
与您在桌面上的运行时环境不同。您的任何PATH
更改或其他环境变量设置~/.bashrc
都不会自动传播到您的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
),然后调用所需的程序。