何度も見ました(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
ません。たとえば、noなので、GUIプログラムには特別な処理(読み取り)が必要です。~/.bashrc
cron
$DISPLAY
man xhost
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