web-dev-qa-db-ja.com

cronタスクの「apt-get-yupgrade」は実行されますが、システムはアップグレードされません

このサーバーはDebian7を実行していて、私は大きな謎に直面しています。

これが私のcronタスクです:

$ Sudo crontab -e

42 15 * * * apt-get -y update >> /var/log/my-apt-update.txt
52 15 * * * apt-get -y upgrade >> /var/log/my-apt-upgrade.txt

システムがアップグレードされない理由を理解しようとするため、">> /var/log/my-apt-upgrade.txt"の部分を追加しました。

Cronタスクが実行されます。毎日/ var/log/syslogに次の行があります。

Nov 14 15:42:01 myhostname /USR/SBIN/CRON[3374]: (root) CMD (apt-get -y update >> /var/log/my-apt-update.txt)
Nov 14 15:52:01 myhostname /USR/SBIN/CRON[3394]: (root) CMD (apt-get -y upgrade >> /var/log/my-apt-upgrade.txt)

そして/var/log/my-apt-upgrade.txtには次のような段落があります(私は過去2日間のみを示しています):

Reading package lists...
Building dependency tree...
Reading state information...
The following packages will be upgraded:
  file libmagic1
2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B/256 kB of archives.
After this operation, 110 kB disk space will be freed.
Reading package lists...
Building dependency tree...
Reading state information...
The following packages will be upgraded:
  file libmagic1
2 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B/256 kB of archives.
After this operation, 110 kB disk space will be freed.

ご覧のとおり、パッケージ「file」と「libmagic1」は初日にアップグレードされているはずです。しかし、そうではありませんでした。それで二日目、彼らは再び言及されます。しかし、アップグレードされていません。

そして今日、私が走れば

$ Sudo apt-get -y upgrade

パッケージ「file」と「libmagic1」が再び言及され、アップグレードされます(最終的に)。

ご覧のとおり、手動でアップグレードできます。ただし、これらのパッケージは、cronタスクが実行されたときに以前にアップグレードされている必要があります。

この謎について何か手がかりはありますか?

追加土11月15日11:48:

これは、cronジョブの前後に私の/var/log/apt/history.logに表示されるものです。

Start-Date: 2014-11-13  15:52:03
Commandline: apt-get -y upgrade
Upgrade: file:AMD64 (5.11-2+deb7u5, 5.11-2+deb7u6), libmagic1:AMD64 (5.11-2+deb7u5, 5.11-2+deb7u6)
Error: Sub-process /usr/bin/dpkg returned an error code (2)
End-Date: 2014-11-13  15:52:03

Start-Date: 2014-11-14  15:52:03
Commandline: apt-get -y upgrade
Upgrade: file:AMD64 (5.11-2+deb7u5, 5.11-2+deb7u6), libmagic1:AMD64 (5.11-2+deb7u5, 5.11-2+deb7u6)
Error: Sub-process /usr/bin/dpkg returned an error code (2)
End-Date: 2014-11-14  15:52:03

同じ種類のメッセージが、異なるパッケージの/var/log/apt/history.logで発生します。たとえば、今月初めに、「wget」パッケージに更新が必要でした(今回は-qqオプションを試してみましたが、このオプションは何の違いもないようです)。

Start-Date: 2014-11-03  15:52:02
Commandline: apt-get -y -qq upgrade
Upgrade: wget:AMD64 (1.13.4-3+deb7u1, 1.13.4-3+deb7u2)
Error: Sub-process /usr/bin/dpkg returned an error code (2)
End-Date: 2014-11-03  15:52:02

Start-Date: 2014-11-04  15:52:02
Commandline: apt-get -y -qq upgrade
Upgrade: wget:AMD64 (1.13.4-3+deb7u1, 1.13.4-3+deb7u2)
Error: Sub-process /usr/bin/dpkg returned an error code (2)
End-Date: 2014-11-04  15:52:03

Start-Date: 2014-11-05  15:52:03
Commandline: apt-get -y -qq upgrade
Upgrade: wget:AMD64 (1.13.4-3+deb7u1, 1.13.4-3+deb7u2)
Error: Sub-process /usr/bin/dpkg returned an error code (2)
End-Date: 2014-11-05  15:52:03
2

問題の原因を見つけたようです。

エラーを検出するには、カスタムログでstderrをキャッチする必要がありました。一部のエラーはrootにメールで送信されず、他のログにも書き込まれなかったため、これを行うと便利であることがわかりました。

ログでstderrをキャッチするために、最初にcronタスクを次のように変更しました。

52 15 * * * apt-get -y upgrade >> /var/log/my-apt-upgrade.txt 2>&1

本日、パッケージ「wlibgcrypt11」が更新されました。今回、ログでエラーが発生しました。これは、/ var/log/apt /history.logに以前に表示されたあいまいなエラーメッセージよりも明確でした。

今日の/var/log/my-apt-upgrade.txt:

Reading package lists...
Building dependency tree...
Reading state information...
The following packages will be upgraded:
  libgcrypt11
debconf: unable to initialize frontend: Dialog
debconf: (TERM is not set, so the dialog frontend is not usable.)
debconf: falling back to frontend: Readline
debconf: unable to initialize frontend: Readline
debconf: (This frontend requires a controlling tty.)
debconf: falling back to frontend: Teletype
dpkg-preconfigure: unable to re-open stdin: 
1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B/300 kB of archives.
After this operation, 35.8 kB of additional disk space will be used.
dpkg: warning: 'ldconfig' not found in PATH or not executable
dpkg: warning: 'start-stop-daemon' not found in PATH or not executable
dpkg: error: 2 expected programs not found in PATH or not executable
Note: root's PATH should usually contain /usr/local/sbin, /usr/sbin and /sbin
E: Sub-process /usr/bin/dpkg returned an error code (2)

したがって、これはPATHエラーでした。

私のシステムのルートのPATHには、必要なすべてのディレクトリが含まれています。 visudoのsecure_path変数も同様です。そのため、Sudoapt-getを手動で実行するとすべてが機能します。

ただし、cronは環境変数を設定しません。そこで、cronタスクごとにPATH環境変数を追加しました。

$ Sudo crontab -e

22 16 * * * PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin' apt-get -y update >> /var/log/my-new-apt-update.txt 2>&1
32 16 * * * PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin' apt-get -y upgrade >> /var/log/my-new-apt-upgrade.txt 2>&1

そしてそれはうまくいきました!パッケージはcronタスクによって正常に更新されました。

6