我见过很多次了(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
但是当我重新启动虚拟机时,脚本没有运行,尽管 cron 登录了/var/log/系统日志显示 crontab 启动脚本。
我想要实现的目标可以轻松实现守护进程这个过程(我确实做到了),我只是想知道为什么 crontab 不启动我的脚本。
答案1
运行的作业cron
不会在桌面上相同的运行时环境中运行。您的任何PATH
更改或其他环境变量设置都不会~/.bashrc
自动传播到您的cron
作业。例如,没有$DISPLAY
,因此 GUI 程序需要特殊处理(读取man xhost
)。
可以在Read 文件cron
中为所有作业设置环境变量。crontab
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