だから本当に奇妙ですが、たぶん単純なものを見ました。しかし、私が理解するほど単純ではありません。問題なく実行できる単純なbashスクリプトを作成しましたが、クローンジョブをスケジュールしてスクリプトを実行しないと問題が発生します。
スクリプトは実行可能で、エラー/問題なしで手動で実行できます。次のコマンドを使用してcrontabに追加してみました。
# crontab -l
30 * * * * /usr/scripts/test_script.sh
また、以下にファイルを追加し/etc/cron.d/test_script
てパスとシェルを指定してみました。
# cat /etc/cron.d/tes_script
PATH=/bin:/usr/bin:/sbin:/usr/sbin
SHELL=/bin/bash
30 * * * * /usr/scripts/test_script.sh
tailf /var/log/syslog
ログを確認し、以下を見ようとしました。
2月7日 10:53:01 CRON[29203]: (ルート) CMD (/usr/scripts/test_script.sh)
したがって、実行しているように見えるかもしれませんが、実際にはそうではありません(プログラムのWebインターフェースで表示される更新プロセスをトリガーします)。
私が逃した部分がありますか?これはスクリプトです。
#!/bin/bash
DIST="ubuntu"
LOGS="/var/logs/test_script.log"
RECIPIENTS="[email protected]"
declare -a POCKET=("release" "security" "updates")
xenial()
{
SERIES="xenial"
for pocket in "${POCKET[@]}"
do
bzip2 -d "$HOLDER"*.bz2
sync-pocks "$pocket" "$SERIES" "$DIST"
sleep 5m
done
return 0
}
precise()
{
SERIES="precise"
for pocket in "${POCKET[@]}"
do
bzip2 -d "$HOLDER"*.bz2
sync-pocks "$pocket" "$SERIES" "$DIST"
sleep 5m
done
return 0
}
xenial &> "$LOGS" &&
precise &>> "$LOGS" ||
cat "$LOGS" | mailx -s "Sync" "$RECIPIENTS"
スクリプトに構文の問題がある可能性がありますか?それでは、手動で実行しても問題がないのはなぜですか?
答え1
これはあなたのコードに基づいていくつかのおおよその推測です。
- ファイルはどのディレクトリにありますか
"$HOLDER"*.bz2
?cd
スクリプトにコマンドは表示されません。たぶんスクリプト間違った目次。 $HOLDER
変数が定義されていません。sync-pocks
あなたの道に?
答え2
cronが実行されると、その構文をサポートしていない「sh」シェルを使用して実行されます&>
。 /etc/cron.d/tes_scriptに設定したSHELL構文ではうまく機能しますが、/etc/cron.dのファイルには使用しない他の構文(ユーザー名をフィールドとして追加)が必要です。
この問題を解決するには、SHELL=/bin/bash
独自のcrontabで設定してください。
答え3
とても遅かったのですが、解決策を見つけました。 -l オプションを使用してスクリプトを実行します。ログインシェルに設定した変数はcronjobを実行せず、エラーは記録されません。マニュアルページによると:
-l は、bash がログインシェルとして呼び出されたかのように動作するようにします (以下の INVOCATION を参照)。
だから私のcrontabは次のようになります。
30 * * * * /usr/scripts/test_script.sh