web-dev-qa-db-ja.com

cronから実行するとこのスクリプトが失敗するのに、手動で実行すると機能するのはなぜですか?

私は比較的単純なbashスクリプトを持っていますが、直接呼び出すとうまく機能しますが、cronで実行すると失敗します。これが失敗するのはなぜですか?cron経由で機能させるにはどうすればよいですか?

#!/bin/bash
apt-get update -y
apt-get upgrade -y
apt-get install boinc-client -y

Cronがそれを実行しようとすると、手動で呼び出すと次のエラーが発生します。

dpkg was interrupted, you must manually run 'Sudo dpkg --configure -a' to correct the problem.

ただし、最初に手動で実行する限り、問題なく動作します。

3
JVC

何が起こっているのかほとんど理解せずにそれを解決することができました。ルートcrontabから実行していても、apt-getコマンドの前にSudoが必要であることが判明しました。論理的には、スクリプトがすでに「ルートとして」実行されているため、必要ないと予想していましたが、Sudoを追加すると、すべてが期待どおりに機能しました。

1
JVC

このタイプの質問に対する通常の答えは、cronジョブは非対話型、非ログインシェルで実行されるため、ほとんどのシェル起動ファイル(_/etc_のシステム全体のファイルとホームディレクトリの個人用ドットファイルの両方)です。ほとんどのシェル起動ファイルはログインシェル(コンピューターにログインしたときに最初に表示されるシェル)またはインタラクティブシェル(ターミナル、sshセッション、またはターミナルに接続されているシェル)に適用されるため、)はソースされません(読み込まれて実行されます)。ユーザーが上記の端末を介してエミュレーターと対話しているため、エミュレーター)。

したがって、実際には_/etc/profile_、_/etc/bashrc_、_~/.profile_などの場所で発生する環境設定(PATHの変更を含む)に実際に依存するcronジョブにコマンドを配置した場合、または_~/.bashrc_、そのセットアップはcronジョブでは発生しません。 cronファイル形式では、ジョブの環境変数を指定できるため、_BASH_ENV_またはENVを指定して、ソースへのシェル起動スクリプトを指定することをお勧めします。 bash(1)のマニュアルページの「呼び出し」セクションを参照してください。

5
Spiff

これは答えにはなりませんが、コメントすることはできません。提案:

  1. bashスクリプトの前に以下を追加します。メール出力に記録される最後の行は、失敗したコマンドになります。

    set -x
    set -e
    
    • sendmailがあることを確認します(postfixesmtpなどの提供パッケージをインストールします)
    • メールリーダーをインストールします(muttを推奨)
    • メールが確実に届くようにする
      • 接尾辞を介して(インストーラーによって自動的に実行される場合があります):root: my-user-name/etc/aliasesまたは/etc/postfix/aliasesに追加します
      • cron経由:適切なcrontabファイルにMAILTO="my-user-name"を追加します
  2. スクリプトが別の環境で実行されることを確認します。 apt-getへのフルパスを指定し(apt-getが見つかったことがわかっているため、おそらく原因ではありません)、Xの外部のコンソール(ターミナルではない)で実行します(一部のdpkg configureスクリプトにはXセッションが必要です)。

    • 絶対パスを使用するようにスクリプトを変更します。つまり、/usr/bin/apt-get update -y(正しいパスに置き換えます)
    • ctrl-alt-f1を押してコンソールに切り替えます
    • rootユーザーに切り替えます:Sudo -i
    • 環境なしで非ログインシェルを開始します:env -i /bin/bash --noprofile --norc(正しいパスに置き換えます)
    • スクリプトを実行します:/my/full/path/to/cronscript。それは機能しますか?
  3. スクリプトには権限がありますか?システムcrontabを使用していますか? (もう一度、おそらく犯人ではありません)

    • システムcrontabを使用していると述べたので、これをスキップします。
  4. Apt-getはセッションサポート(consolekitまたはsystemd)を必要としますか?ただし、これは暗闇の中でのショットです。

    • 助けになるほどよくわからない。
1
user19087