0

私はしばらくこれについて頭を悩ませてきました。root cron ジョブによって実行されるスクリプトがあります。スクリプトは実行されますが、スクリプト内に実行されないスクリプトがあります。これがscriptAと呼ぶものです

#!/bin/bash
lines=`wc -l < /var/www/log/addme`;
DATE=`date +%Y-%m-%d`

if [[ $lines > 4 ]];
then
echo " " > /var/www/log/addme
RESTART=/var/www/log/restart.sh
$RESTART
else
echo "No new hosts added" | wall
fi

基本的に、restart.sh スクリプトが行うことは、サービスを再起動することです。ターミナルから実行するとすべて正常に動作しますが、cron ジョブとしては動作しません...

./restart.sh
/var/www/log/restart.sh

しかし、同じ結果です。何かご意見は?

4

1 に答える 1

2

cron がジョブを実行する最小環境で問題が発生していると思われます。最大の問題は、PATH が非常に最小限であり、スクリプトがおそらく見つからないコマンドを使用していることです。

これが問題である場合は、いくつかの修正方法があります。一般に最も簡単な方法は、スクリプトを実行するエントリの前に、適切な PATH の定義を crontab ファイルに追加することです。このようなもの:

PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
0 * * * *       /var/www/log/scriptA

2 つ目は、scriptA の先頭に同様の割り当てを追加することです。3 番目のオプションは、両方のスクリプトを実行し、使用するすべてのコマンドのフル パスを使用することです (たとえば/usr/bin/wcwc.

ところで、テストにも問題があります[[ $lines > 4 ]]- 内部[[ ]]>は、数値比較ではなく、文字列 (アルファベット) 比較を行います。アルファベット順で 10 は 4 より小さいため、これは問題です。数値比較を行うには、またはのいずれ[[ $lines -gt 4 ]]かを使用します。(( lines > 4 ))

于 2012-11-07T18:39:38.097 に答える