为什么 crontab 不执行预定的 bash 脚本?

为什么 crontab 不执行预定的 bash 脚本?

我见过很多次了(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中为所有作业设置环境变量。crontabman 5 crontab

echo "=== id ===";id;echo "=== set ===";set;echo "=== env ===";env | sort;echo "=== alias ===";alias查看每个环境中的结果 。

由于默认情况下,command该行的部分由 解释,它的语法比 更简单,因此我建议调用一个脚本(可执行文件,已安装,以 开头)来设置环境,然后调用所需的程序。crontab/bin/sh/bin/bashcommandbash#!/bin/bash

相关内容