crontab 編集を python で簡単に

cron はとても便利なものですが、コマンドラインでの編集は割と面倒なものです。

以前から、もっと簡単にテキストファイルを編集するように cron を書き換えられないかと思っていました。python ならできると思い、chatGPT に訊いていみました。

ローカルでは python で gedit を使う

gedit を使うと cron をテキストファイル感覚で編集できます。

chatGPT は gedit を python で開くコードを書いてくれました。


import subprocess
import tempfile

with tempfile.NamedTemporaryFile(mode='w+') as temp_file:
    subprocess.run(['crontab', '-l'], stdout=temp_file, check=True)
    subprocess.run(['gedit', temp_file.name], check=True)
    subprocess.run(['crontab', temp_file.name], check=True)

print("crontabが更新されました。")

password = "pass"
command = "systemctl start cron" 
process = subprocess.Popen(command, shell=True, stdin=subprocess.PIPE)
process.communicate(input=(password + "\n").encode())

こうすると以下のような内容で gedit が起動します。


* 8 * * 3 for i in `seq 0 10 59`;do (sleep ${i}; ~/iptv/shell/NTV.sh) & done;
* 9 * * 3 for i in `seq 0 10 59`;do (sleep ${i}; ~/iptv/shell/NTV.sh) & done;
* 10 * * 3 for i in `seq 0 10 59`;do (sleep ${i}; ~/iptv/shell/NTV.sh) & done;
* 11 * * 3 for i in `seq 0 10 59`;do (sleep ${i}; ~/iptv/shell/NTV.sh) & done;
* 12 * * 3 for i in `seq 0 10 59`;do (sleep ${i}; ~/iptv/shell/NTV.sh) & done;
* 13 * * 3 for i in `seq 0 10 59`;do (sleep ${i}; ~/iptv/shell/NTV.sh) & done;

これを適当に編集して保存し、gedit を終了すると最期にパスワードを訊かれるのでコンピュータのパスワード入力すればOKです。

これまでに比べて、飛躍的に cron 編集が捗るようになりました。

NAS での cron 設定はかなり面倒

python を使って NAS の cron も編集しようといろいろとやってみたのですが、どうも簡単ではありません。

chatGPT の答えもきちんと動くものはあまりありませんでした。

やはり NAS に ssh ログインして操作するしかないようです。
手順としては以下のようにしました。

  1. NAS に ssh ログイン
  2. crontab の内容をテキストファイルに書き込む
  3. テキストファイルを編集して crontab に上書きする
  4. crontab を再起動

NAS に ssh ログイン

まず、NAS に ssh ログインして、sudo になります。


ssh user@192.168.0.77 -p 11123
sudo -i

crontab の内容をテキストファイルに書き込む

以下のようなシェルスクリプトを作成して実行権限を与え実行します。


#!/bin/bash
cat /etc/crontab > /volume1/bak/iptv/crontab_backup.txt

/volume1/bak/iptv/backupcron.sh

こうすると、/volume1/bak/iptv に crontab_backup.txt が作成されるので、それをテキストエディタで開いて編集します。

crontab に上書きする

編集された crontab_backup.txt の内容を crontab に書き込みます。以下のようなシェルスクリプトを作成して実行します。


#!/bin/bash
cat /volume1/bak/iptv/crontab_backup.txt | sudo tee /etc/crontab > /dev/null
synosystemctl restart crond

上のスクリプトには crontab の再起動も設定されています。

ローカルのようにワンタッチというわけにはいきませんが、これまでの煩わしさがかなり軽減されたのではないかと思います。