私は比較的単純な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.
ただし、最初に手動で実行する限り、問題なく動作します。
何が起こっているのかほとんど理解せずにそれを解決することができました。ルートcrontabから実行していても、apt-getコマンドの前にSudoが必要であることが判明しました。論理的には、スクリプトがすでに「ルートとして」実行されているため、必要ないと予想していましたが、Sudoを追加すると、すべてが期待どおりに機能しました。
このタイプの質問に対する通常の答えは、cronジョブは非対話型、非ログインシェルで実行されるため、ほとんどのシェル起動ファイル(_/etc
_のシステム全体のファイルとホームディレクトリの個人用ドットファイルの両方)です。ほとんどのシェル起動ファイルはログインシェル(コンピューターにログインしたときに最初に表示されるシェル)またはインタラクティブシェル(ターミナル、sshセッション、またはターミナルに接続されているシェル)に適用されるため、)はソースされません(読み込まれて実行されます)。ユーザーが上記の端末を介してエミュレーターと対話しているため、エミュレーター)。
したがって、実際には_/etc/profile
_、_/etc/bashrc
_、_~/.profile
_などの場所で発生する環境設定(PATH
の変更を含む)に実際に依存するcronジョブにコマンドを配置した場合、または_~/.bashrc
_、そのセットアップはcronジョブでは発生しません。 cronファイル形式では、ジョブの環境変数を指定できるため、_BASH_ENV
_またはENV
を指定して、ソースへのシェル起動スクリプトを指定することをお勧めします。 bash(1)
のマニュアルページの「呼び出し」セクションを参照してください。
これは答えにはなりませんが、コメントすることはできません。提案:
bashスクリプトの前に以下を追加します。メール出力に記録される最後の行は、失敗したコマンドになります。
set -x
set -e
postfix
やesmtp
などの提供パッケージをインストールします)mutt
を推奨)root: my-user-name
を/etc/aliases
または/etc/postfix/aliases
に追加しますcrontab
ファイルにMAILTO="my-user-name"
を追加しますスクリプトが別の環境で実行されることを確認します。 apt-getへのフルパスを指定し(apt-getが見つかったことがわかっているため、おそらく原因ではありません)、Xの外部のコンソール(ターミナルではない)で実行します(一部のdpkg configureスクリプトにはXセッションが必要です)。
/usr/bin/apt-get update -y
(正しいパスに置き換えます)ctrl-alt-f1
を押してコンソールに切り替えますSudo -i
env -i /bin/bash --noprofile --norc
(正しいパスに置き換えます)/my/full/path/to/cronscript
。それは機能しますか?スクリプトには権限がありますか?システムcrontabを使用していますか? (もう一度、おそらく犯人ではありません)
Apt-getはセッションサポート(consolekitまたはsystemd)を必要としますか?ただし、これは暗闇の中でのショットです。