一致前の行にテキストを追加する

一致前の行にテキストを追加する

この場合、一致(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

  1. crontabファイルを直接編集しないでください。コマンドを使用してくださいcrontab。それがまさにその目的です。

  2. sudoスクリプトで何度も使用しないでください。フルスクリプトを実行するには、sudoを使用してください。

  3. 変数と文字列を正しく引用してください。リテラル文字列は一重引用符で囲み、変数などの補間は二重引用符で囲みます。

  4. 正規表現ではなく固定文字列をgrepする必要があるため、を使用してくださいgrep -F。それ以外の場合、*パターンのsは「0個以上のスペース」として解釈されます。

  5. 特定の戻り値を設定したくない限り(あなたが設定していない)、スクリプトのexit最後にそれを追加する必要はありません。とにかくスクリプトは最終的に終了します。

  6. CCgenerator.shcrontabエントリが存在するかどうかを確認したいのですが、updateKey.sh存在するとします。

  7. もっと重要なのは、なぜ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

スクリプト全体を実際に実行したくない場合は、コマンドを使用するたびにスクリプトを追加してくださいsudosudocrontab

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

関連情報