cron ジョブを追加するときは、一意のラベルの付いたコメントを含めてください。後でその一意のラベルを使用して、cron ジョブが存在するかどうかを判断したり、cron ジョブを「アンインストール」したりできます。
私はいつもこれをしています。これには再利用可能なスクリプトがあります。
#!/bin/sh
#
# Usage:
# 1. Put this script somewhere in your project
# 2. Edit "$0".crontab file, it should look like this,
# but without the # in front of the lines
#0 * * * * stuff_you_want_to_do
#15 */5 * * * stuff_you_want_to_do
#* * 1,2 * * and_so_on
# 3. To install the crontab, simply run the script
# 4. To remove the crontab, run ./crontab.sh --remove
#
cd $(dirname "$0")
test "$1" = --remove && mode=remove || mode=add
cron_unique_label="# $PWD"
crontab="$0".crontab
crontab_bak=$crontab.bak
test -f $crontab || cp $crontab.sample $crontab
crontab_exists() {
crontab -l 2>/dev/null | grep -x "$cron_unique_label" >/dev/null 2>/dev/null
}
# if crontab is executable
if type crontab >/dev/null 2>/dev/null; then
if test $mode = add; then
if ! crontab_exists; then
crontab -l > $crontab_bak
echo 'Appending to crontab:'
cat $crontab
crontab -l 2>/dev/null | { cat; echo; echo $cron_unique_label; cat $crontab; echo; } | crontab -
else
echo 'Crontab entry already exists, skipping ...'
echo
fi
echo "To remove previously added crontab entry, run: $0 --remove"
echo
elif test $mode = remove; then
if crontab_exists; then
echo Removing crontab entry ...
crontab -l 2>/dev/null | sed -e "\?^$cron_unique_label\$?,/^\$/ d" | crontab -
else
echo Crontab entry does not exist, nothing to do.
fi
fi
fi
スクリプトをcrontab.sh
プロジェクト ディレクトリに保存crontab.sh.crontab
し、cron ジョブ定義を使用して を作成します。次に例を示します。
0 0 * * * echo hello world
0 0 * * * date
- cron ジョブをインストールするには、単に実行します
./crontab.sh
- スクリプトは複数回実行しても安全です。一意のラベルが既に存在するかどうかを検出し、cron ジョブの追加を再度スキップします。
- cron ジョブをアンインストールするには、次を実行します。
./crontab.sh --remove
これも GitHub に置きます: https://github.com/janosgyerik/crontab-script
の説明sed -e "\?^$cron_unique_label\$?,/^\$/ d"
:
- 最も単純な形式では、式は基本的に次のようになります。
sed -e '/start/,/end/ d'
- つまり、パターンを含む行を含め、開始パターンと終了パターンに一致する行の間のコンテンツを削除します
- スクリプトは、シェル変数
sed
の値を展開する必要があるため、単一引用符ではなく二重引用符でコマンドを引用します。$cron_unique_label
- 開始パターンは、パターンを囲む代わりに の
\?^$cron_unique_label\$?
ペアを使用します。?
/
$cron_unique_label
/
- 先頭
?
はバックスラッシュでエスケープする必要がありますが、正直なところ理由はわかりません。
- は行頭と行末に
^
一致し、エスケープする必要があります。エスケープしないと、シェルはシェル変数の値を展開します。$
$
$?
- 終了パターン
/^\$/
は比較的単純で、行頭とそれに続く行末、つまり空の行に一致し、ここ$
でもエスケープする必要があります
d
最後の はコマンドsed
で、一致した行を削除し、 のコンテンツから効果的に削除しますcrontab -l
。これにパイプすることができますcrontab -