web-dev-qa-db-ja.com

トップはユーザーによってはいくつかのプロセスを表示していません

スケジューラーによって実行されるはずのトップコマンドを含むスクリプトを開発しました。自分で実行すると期待どおりの結果が得られますが、スケジューラーによって実行されると期待どおりの結果が得られません。

問題のあるコード行はこれです

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が空になります)

スケジューラーによって使用されるユーザーが出力を取得することはありません。

これで何が間違っている可能性があるかについてのアイデアはありますか?

1
Danilo Araya

コマンド

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の環境を設定します(他のプログラムに干渉することなく)。

1
Thomas Dickey