利用者:Crontab でパッケージを更新

提供: ArchWiki
2024年9月5日 (木) 21:58時点におけるKusanaginoturugi (トーク | 投稿記録)による版 (Kusanaginoturugi がページ「Crontab でパッケージを更新」を「利用者:Crontab でパッケージを更新」に移動しました: 英語版でも削除されているので)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

関連記事

警告: cron による自動アップデートは非推奨です。マシンが起動できなくなる状態になる可能性があります。マシンが壊れてしまった場合、自分で修正する必要があります。

手順

  1. まずは cron をインストールしてください。
  2. pacman が失敗したときに通知を送れるように Postfix などのメール転送エージェントをインストールすることを推奨します。
  3. root で実行: crontab -e
  4. crontab に以下を貼り付けてください:
MAILTO=your@email
LOGFILE=/var/log/cron-pacman.log

# 1. minute (0-59)
# |   2. hour (0-23)
# |   |   3. day of month (1-31)
# |   |   |   4. month (1-12)
# |   |   |   |   5. day of week (0-7: 0 or 7 is Sun, or use names)
# |   |   |   |   |   6. commandline
# |   |   |   |   |   |
#min hr  dom mon dow command
00   13   *   *   *  . /etc/profile && (echo; date; pacman -Syuq --noconfirm) &>>$LOGFILE || (echo 'pacman failed!'; tail $LOGFILE; false)

値は自由に設定してください。例えば min を */2 とすることで2分毎にアップデートをチェックすることができます。

アップグレードが成功したときに自動でコンピュータを再起動させたい場合、上記の行の末尾に '&& reboot' を追加してください。

ノート: `pacman -Syuq` ではなく `pacman -Syuwq` を使うことで '-w' によってサーバーからパッケージを取得しながらインストールやアップグレードは行わないようにできます。手動でアップデートするときにパッケージのダウンロードを待つ必要がなくなります。

自動アップデートの手動設定

ノート: 以下のセクションは主としてホームユースで Linux をコンピュータにセットアップしているユーザー向けです。
警告:
  • KCronGNOME Schedule は crontab の中で独自のラッパーを使用してタスクを実行するため問題が発生します。例えば pacman-db-upgrade/var/lib/pacman/db.lck のロックファイルが残ってしまい pacman コマンドが実行できなくなります。
  • 先に pacman データベースのバックアップを作成してください。

ホームユーザーのために Arch Linux をセットアップして常にシステムを最新状態にしたい場合、バックグラウンドで実行するようにする必要があります。

アップデートのダウンロード

標準出力にアップデートのリストを出力するスクリプトを作成:

ShortListUpdates.sh
#!/bin/bash
pacman -Qq | \
grep -e smplayer \
-e smtube \
-e ^jre \
-e ^gst \
-e firefox | \
grep -v -e 'to_ignore_package1' -e 'to_ignore_package2' -e 'to_ignore_package3'
#Files from a group to add
pacman -Qqg kde | grep -v -e 'to_ignore_package1' -e 'to_ignore_package2' -e 'to_ignore_package3'
  1. ダウンロードするべきものが存在するか確認する: if [ ! -f /tmp/.downloaded_yes ];then echo Is OK to download;else echo Already downloaded;fi
  2. コンピュータがアイドル状態か確認する。xprintidle ユーティリティ (X) あるいは w コマンド (tty) を使う。
  3. コンピュータが電源に接続されていて十分なバッテリー残量があることを確認。upower をインストールする必要があります。
    #!/bin/bash
    
    MAXpower="60"
    
    ST=($(upower -i "$(upower -e | grep 'BAT')" | grep -e "state" -e percentage | awk '{print $2}' | sed 's/%//g'))
    if [ ! -z ${ST[0]} ];then
     if [ ${ST[1]} -gt ${MAXpower} ]  || [ ${ST[0]} == 'charging' ] || [ ${ST[0]} == 'fully-charged' ]; then
      echo "OK"
       else
      echo "Fail"
     fi
      else 
     echo "OK"
    fi
  4. コンピュータが 3G あるいは PPP 接続を使っている場合、巨大なデータをダウンロードしないように接続タイプをチェック: ifconfig | grep ^ppp -c
  5. オンラインかどうか確認: ping -c 1 8.8.8.8 ; if [ "${?}" != "0" ]; then echo bad; else echo good; fi。ファイアウォールによって ping リクエストがブロックされている場合 ifconfig | grep -v 'lo:' | grep RUNNING -c を使う。またはファイルのダウンロードを試行してエラーが発生しないか確認。
  6. 重要なアップデートのリストを作成。
    ノート: 毎日ダウンロードするためリストを大きくしすぎないでください。
  7. ダウンロードが完了した後にアップデートチェックが繰り返されることを防ぐ: echo downloaded > /tmp/.downloaded_yes

リストからアップデートをダウンロード・インストール

リストからアップデートをダウンロードするには pacman -Sw --noconfirm --needed $(/full/path/to/ShortListUpdates.sh) を使います。

...............
...............
yes | pacman -S --noconfirm --needed $(/full/path/to/ShortListUpdates.sh)
systemctl daemon-reload
sleep 2
...............
...............

sleep タイムアウトが小さすぎると画面がフリーズする可能性があるので注意してください。

#!/bin/bash
sleep 5
if [ "$(pgrep X -c)"  != "0" ]; then
export DISPLAY=:0
else
export DISPLAY=:0
startx "$0"
fi
.........
.........
.........

crontab を使って起動時にリストからのアップデートを予定することができます:

@reboot /usr/local/bin/update
ノート: update-downloading スクリプトを /tmp にコピーしてディスクの使用をできるだけ避けることができます。

夜間にダウンロード・インストール

夜間もコンピュータの電源を入れっぱなしにする場合、以下のようにコンピュータが待機状態になったときにダウンロード・インストールを開始できます。

..............
..............# Battery and connection safety checks
..............
yes | pacman -S --needed $(pacman -Ssq openjdk | grep -v -e doc -e src)
  if [ $(ifconfig | grep ^ppp -c)  != "0" ];then
    pacman -Suw --noconfirm
   else
    pacman -Qq --native  | pacman -Sw --needed -
  fi
yes | pacman -Su
if [ "${?}" != "0"  ];then beep -f 100 -l 1000 && zenity --warning --text="Ett problem har uppstått. Kontakta Admin!"
if [ -f "/var/lib/pacman/db.lck"  ];then zenity --warning --text="Databasfilen är skadat eller används: /var/lib/pacman/db.lck";fi;
exit 1
else
BkupDate=$(date '+%A-day_of_the_week-%u')
pacman -Q --native > /opt/.alt_db_bkup-"${BkupDate}"
date >> /opt/.alt_db_bkup-"${BkupDate}"
systemctl daemon-reload
sleep 2
fi
pacman-db-upgrade
..............
..............
..............

コンピュータが有線・無線接続されている場合、無視リストに存在するパッケージもダウンロードされます。また、アップデートをダウンロードしてから次の日にインストールさせることもできます。

AUR からパッケージをアップデート

まず GPG 鍵を作成して makepkg の設定ファイルに追加してください:

/etc/makepkg.conf
...............
PKGDEST=/path/to/custom_repo
GPGKEY="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
...............
警告: ときどきパッケージの名前や依存関係が変わることでアップデートができなくなる可能性があります。

AUR のパッケージを最新状態に保つことは難しいですが、以下のような方法があります:

  • AUR からファイルをダウンロードするスクリプトを作成する。あるいは AUR ヘルパーを使用する。ただしパッケージが公式リポジトリに移動された場合はインストールしたパッケージが更新されないので、チェックが必要です。
  • バイナリをダウンロード・展開してパッケージをアップデートする。ただしパッケージのバージョンは pacman データベースに登録されません。
  • 仮想環境に複製してアップデートを監視し、テストすることで問題が起こったときに解決策を練ることができます。

mirrorlist ファイルのアップデート

月に数回の頻度でミラーのアップデートを定期的に行うようにすることができます。Reflector を見てください。

ノート: 大抵は pacman-mirrorlist のアップデート後に /etc/pacman.d/mirrorlist.pacnew ファイルが作成されます。

参照: pacman-mirrorlist がインストールされていない場合