最近、長い間実行されていたクローンスクリプトに問題が発生し、突然動作を停止しました。スクリプトはルート crontab で実行されます。組織構造は次のとおりです。
run_script.sh
crontabでスクリプトを実行します。- .shスクリプトから特定のディレクトリに移動して実行します。
pipenv run python script.py
手動で実行するとうまくいきますrun_script.sh
が、cronによってトリガされるとpython3(script.pyはpython3で書かれています)にありますが、python2にはないライブラリのインポート中にエラーが返されます。したがって、ログにはインポートライブラリのエラーのみが表示されますが、何らかの理由でパイプラインを使用してvenvを設定するのに問題があるようです。
変更しようとしましたが、run_script.sh
まだpipenv run python3 script.py
同じエラーログが表示されます。
また、cronファイルでPATH環境を設定し、run_script.sh
既存のPATHにpython3パスを追加してみましたが、私にはうまくいきませんでした。
最後に、私のsudo apt update && upgrade
コンピュータはまだスクリプトを実行できません。
uname -a
合計の出力は次のとおりですlsb_release -a
。
Linux ubuntu 5.7.0-2-amd64 #1 SMP Debian 5.7.10-1 (2020-07-26) x86_64 GNU/Linux
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 11 (bullseye)
Release: 11
Codename: bullseye
よろしくお願いします!
答え1
ジョブがによって実行されているcron
か、systemd
起動スクリプトがデスクトップで実行されているのと同じランタイム環境で実行されていません。systemd
でスクリプトを起動しますroot
。変更やその他の環境変数の設定は、ジョブにPATH
自動的に伝播されませんcron
。たとえば、no$DISPLAY
なので、GUIプログラムには特別な処理(読み取り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