crontabのエントリを更新するコードスニペットをスクリプトに追加しようとしています。これまで私は次のような作業をしてきました。
crontab -u root -l | grep -w "$VAR" | crontab -u root - && { crontab -l -u root 2>/dev/null; echo "0 */2 * * * /root/$VAR/script > /dev/null 2>&1"; } | crontab -u root -
目的は、これを複数のスクリプトで実行することです。すべてのスクリプトは$ VARに基づいて独自の行を見つけて更新します。
たとえば、
スクリプト1
#!/bin/bash
VAR="home1"
crontab -u root -l | grep -w "$VAR" | crontab -u root - && { crontab -l -u root 2>/dev/null; echo "0 */2 * * * /root/$VAR/script > /dev/null 2>&1"; } | crontab -u root -
echo "Hi"
exit 0
スクリプト2
#!/bin/bash
VAR="home2"
crontab -u root -l | grep -w "$VAR" | crontab -u root - && { crontab -l -u root 2>/dev/null; echo "0 */2 * * * /root/$VAR/script > /dev/null 2>&1"; } | crontab -u root -
echo "Hi"
exit 0
私が追加したいのは、これらのスクリプトに次のcrontabを生成させることです。
0 */2 * * * /root/home1/script > /dev/null 2>&1
0 */2 * * * /root/home2/script > /dev/null 2>&1
何らかの理由で最後の実行はすべての項目を上書きします。
どのようなヒントがありますか?ありがとうございます!
答え1
ファイルまたは標準入力を使用してcrontabを設定すると、既存のコンテンツに追加するのではなく、コンテンツを新しく作成(上書き)します。
簡単な解決策は、各項目をファイルに書き込むことです。
crontab -u root -l | grep -w "$VAR" | crontab -u root - && \
{ crontab -l -u root 2>/dev/null; echo "0 */2 * * * /root/$VAR/script > /dev/null 2>&1"; } \
>> cron-entry-file
その後、すべてのアイテムを収集し、次の操作を一度だけ実行します。
crontab -u root cron-entry-file
異なるスクリプトや他の時間にアイテムを生成する場合は、毎回次のことを行う必要があります。crontab -l > cron-entry-file
現在の設定を維持し、上記の手順に従ってください。 (誰かがよりエレガントな解決策を思い出すことができることを願っていますが、この無差別的なアプローチはうまくいくでしょう。)
編集する
あなたのシナリオは、最初に上記の内容を書いたときに思ったほど単純ではありませんので、crontabファイルを直接操作することを検討してください。これは通常のファイルです(例:/var/cron/tabs/{username}の下)。次の内容をまず読んでください。https://serverfault.com/questions/347318/is-it-bad-to-edit-cron-file-manually
答え2
スクリプトを更新するcronエントリを持つ最良の方法は、そのエントリを別々のファイルとして指定し、cronにそのエントリから情報を取得させることです。質問に提供した例に基づいて、次のことが行われました。
echo "0 */2 * * * root /root/$VAR/script > /dev/null 2>&1" > /etc/cron.d/$VAR
その後、/etc/cron.d/に変数名の付いたファイルが作成され、ファイル自体で定義されたスケジュールに従います。このスレッドで提案されているように、crontabを管理するよりもきれいです。