cron のコマンド部の % 記号はエスケープが必要
% 記号を含むコマンドでエラーとなる場合
cronで、ランダムな秒数スリープしてからコマンドを実行する、のような記述を以下の様に記述した。
0 0 * * * root sleep $(($RANDOM % 60)) && echo foo
$(())
は数式の評価を行ない、$RANDOM
は0から32767までのランダムな整数値を返す。sleep $(($RANDOM % 60))
で0〜59秒のランダムな時間スリープできる。
シェルでsleep $(($RANDOM % 60)) && echo foo
を実行すれば0〜59秒のランダムな時間だけ待ってからfoo
を標準出力に出力する。
しかしcronでは構文エラーとなる。
/bin/sh: 1: Syntax error: end of file unexpected (expecting ")")
(開きカッコ"("
があったのに)最後まで閉じカッコ記号")"
が見つからなくて構文エラーとなっている。
% 記号をコマンドで使いたい場合はエスケープが必要
%
記号よりあとはコマンドと認識されずにこの問題が発生する。
\(バックスラッシュ)でエスケープすれば正常に動作する。
0 0 * * * root sleep $(($RANDOM \% 60)) && echo foo
cron のコマンド部における % 記号の意味
cronで%記号以降は標準入力としてコマンドに送られる。
» crontab(5)
例えば以下のようにcat%foo
とすれば、cat
コマンドの標準入力として文字列fooが送られる。
0 0 * * * root cat%foo
\第一線のプログラマーの行動原理を学べる!/