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