このshスクリプトがあります。
ufw allow 27017 && iptables -F
test.shファイルから
次のようにルートのcronjobを使用して毎日07:00に実行したいと思います。
0 7 * * * /root/cron/test.sh
また、このスクリプトが実際にgrep CRON /var/log/syslogを使用して実行されていることを確認し、実行されていることがわかります。
8月24日 07:00:01 vps118774 CRON[1672]: (ルート) CMD (/root/cron/test.sh)
私の問題は、test.shの実際のスクリプトが適切なcronjobを使用して実行されているポートのロックを解除するために正しく実行されないことです。要点は、次のようにサーバーの端末でスクリプトを手動で実行することです。
sh script.sh
すべてがうまく機能し、スクリプトが必要なタスクを実行するので、スクリプトは期待どおりに実行されますが、cronの実行に問題はありますか?
実行ログを入れたところ、次のような結果が出ました。
root/cron/test.sh: 2: /root/cron/test.sh: ufw: 見つかりません
ベストアンサー1
Cronジョブは、通常の対話型シェル環境とは異なるシェル環境で実行されます。たとえば、このPATH
変数にはさまざまなディレクトリのリストを含めることができ、ユーティリティの実行に慣れているいくつかのディレクトリが欠落している可能性があります。
ufw
ユーティリティがどこにあるかを調べてcommand -v ufw
から(コマンドラインで使用)
- スクリプトでユーティリティのフルパスを使用するか、
- ユーティリティ(および)を見つけることができるディレクトリを
PATH
含むようにスクリプト内の変数を変更します。ufw
iptables
質問が示すように、スクリプトに正しい#!
- 行がありません。明示的に実行しても問題はありませんが、sh
cronジョブ仕様ではそうしません。代わりにスクリプトを実行可能にし、次のように記述します。
#!/bin/sh
PATH="$PATH:/usr/sbin:/sbin"
ufw allow 27017 && iptables -F
次に、今のようにcrontabでスクリプトを呼び出します。
ここでは、スクリプトでこれを行う方法を示すために、/usr/sbin
2つのディレクトリと変数も追加/sbin
しました。PATH