ルートのcrontabエントリからではなく、コマンドラインからbashスクリプトを実行できるという奇妙な問題があります。 Ubuntu 12.04を実行しています。
* * * * 1-5 root /home/xxxxxx/jmeter/VerificationService-0.0.1-SNAPSHOT/jmeter-cron-randomise.sh >> /home/xxxxxxx/jmeter/VerificationService-0.0.1-SNAPSHOT/cron.log
bashを使用してcmd行からスクリプトを実行すると、正常に動作しますが、次のエラーでshで失敗します。
jmeter-cron-randomise.sh: 7: jmeter-cron-randomise.sh: arithmetic expression: expecting primary: " % 1 "
問題をグーグルで調べたところ、スタンドシェルにはbashのような%(モジュラス)のような同じ数学演算子がないようです。スクリプトでcronジョブが失敗する理由がわかりませんか?そのbashシェルを使用していないので、私はそれを仮定していますか? cronデーモンによって確実に起動されます(/ var/log/syslogで確認できます)。助けていただければ幸いです。
問題を引き起こすスクリプト
#!/bin/bash
echo Running the jmeter-cron-randomiser script
script="/home/xxxxxxx/jmeter/VerificationService-0.0.1-SNAPSHOT/jmeter-cron.sh"
min=$(( 1 * 1 ))
rmin=$(( $RANDOM % $min ))
echo "min = ${min}";
echo "rmin = ${rmin}"
at -f "$script" now+${rmin}min
crontab(5) manページで、これに注意します:
「6番目」フィールド(行の残り)は、実行するコマンドを指定します。行のコマンド部分全体は、/ bin/shまたはcronfileのShell変数で指定されたシェルによって実行されます。
そのため、次のいずれかの方法でbashを指定できます。
Shell=/bin/bash
または、上記はすべてのcronスクリプトに影響するため、これは
* * * * 1-5 root bash /home/xxxxxx/jmeter/VerificationService-0.0.1-SNAPSHOT/jmeter-cron-randomise.sh >> /home/xxxxxxx/jmeter/VerificationService-0.0.1-SNAPSHOT/cron.log
# ...............^^^^
Crontab doesbash
;でスクリプトを実行します。
ただし、at
を使用して再帰的に実行しています。
at
は/bin/sh
を使用します。
以前の問題のため、at
の時間指定はnow+0min
なので、最後に再び実行されます。
その実行は失敗するため、少なくともループはありません。
now+0min
につながる問題は、n % 1
が0であるため、$RANDOM % 1
= 0、およびrmin
= 0です。
2行目を追加
set -x
ロギングを改善するためにスクリプトに追加すると、timespecが0の最後の行になります。