Pipelinenvを含む.shスクリプトが手動で正しく実行されますが、cronを介して実行されないのはなぜですか?

Pipelinenvを含む.shスクリプトが手動で正しく実行されますが、cronを介して実行されないのはなぜですか?

最近、長い間実行されていたクローンスクリプトに問題が発生し、突然動作を停止しました。スクリプトはルート crontab で実行されます。組織構造は次のとおりです。

  • run_script.shcrontabでスクリプトを実行します。
  • .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環境変数は、すべてのジョブの読み取りファイルで設定できます。crontabman 5 crontab

echo "=== id ===";id;echo "=== set ===";set;echo "=== env ===";env | sort;echo "=== alias ===";alias各環境の結果を確認してください。

その行はデフォルトで解釈されるため、構文はcommandそれよりも単純なので、環境を設定した後に必要なプログラムを呼び出すスクリプト(実行可能、インストール、開始)を呼び出すことをお勧めします。crontab/bin/sh/bin/bashcommandbash#!/bin/bash

関連情報