この場合、一致(updateKey.sh)を見つける前に行にテキストを追加しようとしましたが、機能しませんでした。これは私のcrontabファイルで、スクリプトはここに行を追加します。
0 06,18 * * * /home/server/scripts/CCgenerator.sh
0 05 * * * /home/server/scripts/updateKey.sh
最初の行「CCgenerator.sh」は時々削除されますが、そう見えます。以下はその行を追加するスクリプトです。
#!/bin/bash
CCgenerator="0 06,18 * * * /home/server/scripts/CCgenerator.sh"
updateKey="0 05 * * * /home/server/scripts/updateKey.sh"
if ! sudo grep -q "$CCgenerator" /var/spool/cron/crontabs/root; then
echo "Adds CCgenerator.sh"
sudo sed -i '/\$updateKey/i $CCgenerator' /var/spool/cron/crontabs/root
else
echo "CCgenerator.sh found"
fi
exit
答え1
cronの編集目的のために、l0b0の答えは次のスクリプトを修正するための最良の方法です。
- 検索キーのエスケープ点とアスタリスク(
updateKey
) - 代替区切り記号を使用する
sed
(マイ選択%
) - sed式の周りの二重引用符(解析したいbash変数)
#!/bin/bash
CCgenerator="0 06,18 * * * /home/server/scripts/CCgenerator.sh"
updateKey="0 05 \* \* \* /home/server/scripts/updateKey\.sh"
if ! grep -q "$CCgenerator" cron; then
echo "Adds CCgenerator.sh"
sed -i "\%$updateKey%i $CCgenerator" cron
else
echo "CCgenerator.sh found"
fi
exit
答え2
crontabを直接更新したくないので、代わりにクローン操作のための標準メカニズムの追加:
line="* * * * * /path/to/command"
(crontab -u userhere -l; echo "$line" ) | crontab -u userhere -
答え3
crontabファイルを直接編集しないでください。コマンドを使用してください
crontab
。それがまさにその目的です。sudo
スクリプトで何度も使用しないでください。フルスクリプトを実行するには、sudoを使用してください。変数と文字列を正しく引用してください。リテラル文字列は一重引用符で囲み、変数などの補間は二重引用符で囲みます。
正規表現ではなく固定文字列をgrepする必要があるため、を使用してください
grep -F
。それ以外の場合、*
パターンのsは「0個以上のスペース」として解釈されます。特定の戻り値を設定したくない限り(あなたが設定していない)、スクリプトの
exit
最後にそれを追加する必要はありません。とにかくスクリプトは最終的に終了します。CCgenerator.sh
crontabエントリが存在するかどうかを確認したいのですが、updateKey.sh
存在するとします。もっと重要なのは、なぜcrontabのルールがどこにあるのかということです
CCgenerator.sh
。ファイルの先頭または末尾にあっても効果は同じです。だから全く探す必要はありませんupdateKey.sh
。
これにより、上記のすべての問題が解決されます。
#! /bin/bash
CCgenerator='0 06,18 * * * /home/server/scripts/CCgenerator.sh'
if ! crontab -u root -l | grep -Fq "$CCgenerator" ; then
echo 'Adding CCgenerator.sh'
# append "$CCgenerator to end of root's crontab
(crontab -u root -l ; printf '%s\n' "$CCgenerator") | crontab -u root
else
echo 'CCgenerator.sh found'
fi
スクリプト全体を実際に実行したくない場合は、コマンドを使用するたびにスクリプトを追加してくださいsudo
。sudo
crontab
線CCGenerator.sh
に基づいて線の位置に本当に興味がある場合は、次のようにします。updateKey.sh
#! /bin/bash
CCgenerator='0 06,18 * * * /home/server/scripts/CCgenerator.sh'
updateKey='0 05 \* \* \* /home/server/scripts/updateKey\.sh'
if ! crontab -u root -l | grep -Fq "$CCgenerator" ; then
echo 'Adding CCgenerator.sh'
crontab -u root -l | sed -e "\:$updateKey: i\
$CCgenerator
" | crontab -u root
else
echo 'CCgenerator.sh found'
fi
$updateKey
ただし、存在しない場合は何もしませんcrontab
。より良いバージョンはgrep forであり$updateKey
、存在する場合はsed
挿入するコマンドを実行し、それ以外の場合はcrontabの末尾に追加するために使用する$CCgenerator
サブシェルのようなものを使用することです。crontab -u root -l ; printf ...
$CCgenerator
たぶん、次のようなものがあります。
#! /bin/bash
CCgenerator='0 06,18 * * * /home/server/scripts/CCgenerator.sh'
updateKey='0 05 \* \* \* /home/server/scripts/updateKey\.sh'
# we're going to use `crontab -u root -l` multiple times, it's
# best to just fetch it once and store it in a variable.
rootcrontab="$(crontab -u root -l)"
if ! grep -Fq "$CCgenerator" <<<"$rootcrontab"; then
if grep -q "$updateKey" <<<"$rootcrontab" ; then
echo 'Inserting CCgenerator.sh'
echo "$rootcrontab" | sed -e "\:$updateKey: i\
$CCgenerator
" | crontab -u root
else
echo 'Appending CCgenerator.sh'
printf '%s\n' "$rootcrontab" "$CCgenerator" | crontab -u root
fi
else
echo 'CCgenerator.sh found'
fi
注:$updateKey
その*
文字はすでにエスケープされているため、使用する必要はありませんgrep -F
。