2

CPU 負荷をログに記録するために書いている bash スクリプトのスニペットを次に示します。

#!/bin/bash
# ... irrelevant nonsense ...
cmd1="/usr/bin/mpstat -P ALL | egrep '(AM|PM)([[:space:]]+)(0)' | tr -s ' ' | cut -d' ' -f4"
ldsys="$(echo $cmd1 | /bin/sh)"
# ... irrelevant nonsense ...

$ldsys従来どおりコンソールからスクリプトを実行すると正しく設定されます。ゴールデンです。問題は次のとおりです。crontab で実行すると、$ldsys空になります。

このことを機能させるために、過去 3 時間、何百万ものことを試してきましたが、何も見つかりませ。誰にもアイデアはありますか?


ノート:

  • /usr/bin/mpstat cron で実行できます。毎分起動する偽のタスクを追加してテストし/usr/bin/mpstat -P ALL >> somefile、出力を確認しました。できます。

  • egreptr、およびcutすべて cron の下で正常に機能します。

  • 私はそれが本当に eval 割り当て規則に関係していると考えています...しかし、それが比較的基本的な構造であることを考えると、なぜそれが問題になるのかわかりません...アダムの提案を試した後、どう考えればいいのかわかりません...

編集:使用法を取り除きましたeval...まだサイコロはありません。

4

3 に答える 3

1

あなたの問題は から来ていmpstatます。コマンドプロンプトから実行すると、時刻が AM/PM で出力されます。によって実行されている場合はそうではありませんcron。ennuikiller示唆したように、それはおそらく環境の問題です。私のシステムecho $LANGでは、コマンド プロンプトで "en_US.UTF-8" が表示されますが、.NET で実行しても何も表示されませんcron。これまたは他の環境変数が時間のmpstat出力方法に影響を与えているためgrep、「(AM | PM)」の場合、それが見つかりません。

ところで、次のようにしてみませんか。

ldsys=$(/usr/bin/mpstat ... )

「cmd1」への割り当てなしで、eval、 、および?echoへの配管sh

于 2009-11-11T14:24:59.910 に答える
0

次の 2 つの問題のいずれかが発生しています。

This is perhaps our number one complaint with cron. When you login to Unix, startup scripts setup your environment. You can see your environment with the commands "printenv" or "env". On the other hand, cron sets up only a sparse environment 

通常、プログラムの出力は STDOUT (標準出力) に送信され、通常は誰かの表示画面に表示されます。cron によって開始されたジョブの場合、STDOUT はローカル メール サブシステムに送信されます。つまり、cron ジョブによって生成された出力は、ジョブを所有するユーザーにメールで送信されます。

于 2009-11-11T12:31:06.820 に答える
0

を排除しようとしましたevalか?

それ以外の

ldsys=`eval $cmd1`

試す

ldsys=`echo "$cmd1" | /bin/sh`

また

ldsys="$(echo $cmd1 | /bin/sh)"
于 2009-11-11T12:53:07.010 に答える