スケジューラによって実行されると予想されるtopコマンドを含むスクリプトを開発しました。自分で実行すると期待した結果が得られますが、スケジューラで実行すると期待した結果は得られません。
問題のコード行は次の行です。
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
注文する
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列ですが、デフォルトの幅は言及しません。いいえオプション。
行が短くなると、grep forはACES_KOFAX_TCM_DRS
失敗し、スクリプトは空の文字列を返します。使用する場合-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
他のプログラムを中断することなく環境を設定します。