test.sh
シェルスクリプトがあります/home/username
ファイルtest.sh
には次の行が含まれています。
#!/bin/sh
cd /home/username/bin
sh launch.sh ParameterName
#launch.sh is in /home/username/bin directory
次のようにcrontabエントリを設定しました。
* * * * * /home/username/test.sh
端末で実行するとうまく/home/username/test.sh
動作します。しかし、うまくいきませんcron
。
答え1
コマンドラインでスクリプトを正しく実行することに関連するほとんどすべての問題は、cron
PATH変数の設定が原因で発生します。man 5 crontab
Vixie cronによると:
On the Debian GNU/Linux system, cron supports the pam_env module, and
loads the environment specified by /etc/environment and /etc/secu‐
rity/pam_env.conf. It also reads locale information from
/etc/default/locale. However, the PAM settings do NOT override the
settings described above nor any settings in the crontab file itself.
Note in particular that if you want a PATH other than "/usr/bin:/bin",
you will need to set it in the crontab file.
cron
他のシステムおよび/または他の実装の詳細は異なる場合がありますが、cronから渡されたスクリプトのPATHは、シェルのパスよりも制限的である可能性があります。。
これは、スクリプト(またはスクリプトから呼び出されたスクリプト/プログラム)によって呼び出されたすべてのエントリが、たとえば内で呼び出されたときに実行時に/usr/local/bin
見つからないことを意味しますcron
。
スクリプトを呼び出してこれをテストできます。
PATH=/usr/bin:/bin /home/username/test.sh
crontab ファイルのパスを拡張すると、この問題を解決できます。
PATH = /usr/local/bin:/usr/bin:/bin
スクリプトが呼び出される実際の行の前に。変数は置き換えられません(したがって、これを行わないでくださいPATH = /usr/local/bin:$PATH
)。
スクリプトの上部付近のログファイルの1つにechoステートメントを含めることも良い習慣です。
TSTLOG=/var/tmp/myscript.log
echo "invoking script" > "$TSTLOG"
date >> "$TSTLOG"
echo "$PATH" >> "$TSTLOG"
(意図的にここで取り上げましたecho
)。したがって、プログラムが呼び出されているかどうか、どのような環境でこの現象が発生するのかを確認できます。
電子メールも確認する必要があります。システム自体で、システムが通常のアカウントに電子メールを転送するように設定されていない場合。多くのcron電子メールは電子メールがないので目立たない[email protected]
。システムは、cronで使用されているローカルアカウントで読み取り可能なメッセージを配置します。
答え2
2つのオプション:
オプション1 - お持ちですchmod +x test.sh
か?
これにより、./test.sh
代わりにとして実行できますsh test.sh
。
オプション2 - ファイルをchmodしたくない場合は、crontabエントリを次のように変更します。
* * * * * /usr/bin/sh /home/username/test.sh
また、後者を選択する場合は、次のようにsh
バイナリの場所を確認する必要があります。
which sh