スケジューラーによって実行されるはずのトップコマンドを含むスクリプトを開発しました。自分で実行すると期待どおりの結果が得られますが、スケジューラーによって実行されると期待どおりの結果が得られません。
問題のあるコード行はこれです
ESBLOGENTRY=`top -b -n 1 -c|grep " DataFlowEngine"|grep -v grep| gawk '{ print strftime("[%Y-%m-%d %H:%M:%S]"), $0 }'|grep ACES_KOFAX_TCM_DRS|sed 's/[ ]*$//'`
インタラクティブで完全なコマンドオプション(-b -n 1 -c)を使用せずにtopを実行し、その後grepしてタイムスタンプを追加しています
マシンのシステム管理者が、rootおよび同じユーザーに対してsuを実行するコマンドを実行しましたが、プロセスが消えてしまうことがあります(ESBLOGENTRYが空になります)
スケジューラーによって使用されるユーザーが出力を取得することはありません。
これで何が間違っている可能性があるかについてのアイデアはありますか?
コマンド
ESBLOGENTRY=`top -b -n 1 -c|grep " DataFlowEngine"|grep -v grep| gawk '{ print strftime("[%Y-%m-%d %H:%M:%S]"), $0 }'|grep ACES_KOFAX_TCM_DRS|sed 's/[ ]*$//'`
top
の出力には、少なくとも次の2つの文字列が含まれると想定しています。
DataFlowEngine ACES_KOFAX_TCM_DRS
これは34文字です。簡単なチェックでは、top
は64列目から始まるコマンドを表示しています。しかし、top
は80列までの行しか表示していません。環境が$COLUMNS
をより広い値に設定している場合、top
はその値を使用する可能性があります(簡単なチェックでは、Debian 7でそれが起こります)。 top
マニュアルページ-w
オプションを使用すると、デフォルトで512列ですが、デフォルトの幅については何も述べていませんwithoutオプション。
行が短くなると、ACES_KOFAX_TCM_DRS
のgrepが失敗し、スクリプトが空の文字列を返すようになります。 -w
オプションを使用すると、スクリプトはより一貫して機能するはずです。
または、コマンドをに変更します
ESBLOGENTRY=`COLUMNS=128 top -b -n 1 -c|grep " DataFlowEngine"|grep -v grep| gawk '{ print strftime("[%Y-%m-%d %H:%M:%S]"), $0 }'|grep ACES_KOFAX_TCM_DRS|sed 's/[ ]*$//'`
top
の環境を設定します(他のプログラムに干渉することなく)。