次のコマンドでプロセスを実行したとします。
myapp -e -c -f myapp.config > /var/log/myapp/myapp.log 2>&1
しばらくするとpid
、myapp
プロセスは1234 myapp.log
だけになりpid
ます。すべてのフラグを指定してコマンドを取得し、出力を何らかの方法でリダイレクトする方法はありますか?
次のコマンドでプロセスを実行したとします。
myapp -e -c -f myapp.config > /var/log/myapp/myapp.log 2>&1
しばらくするとpid
、myapp
プロセスは1234 myapp.log
だけになりpid
ます。すべてのフラグを指定してコマンドを取得し、出力を何らかの方法でリダイレクトする方法はありますか?
回答:
ps -o args= -p "$pid"
プロセスが引数リストを後でオーバーライドしなかった場合、プロセスが実行した最後のコマンドに与えられた引数リスト(または、実行されなかった場合は、その親が実行したコマンド)を教えてくれます。
ps
いくつかのps
実装でいくつかの-w
オプションを追加することで上げることができる可能性がある制限まで、スペースで連結された引数リストが表示されます)。Linuxでは、NULバイトで区切られたarglistをで確認できます/proc/$pid/cmdline
。
lsof +fg -ap "$pid" -d 0-2
プロセスのstdin、stdout、およびstderrファイル記述子が何を指しているか、およびそれらが開かれたモードを示します(POSIXシェルでリダイレクトが使用されたW,AP
かのように、追加を伴う書き込み専用の場合のように>>
)。
readlink /proc/$pid/fd/1
ps
コマンドを使用し、pidを指定して-p
スイッチで調べるか、スイッチを使用し-f
て完全なリストを表示するか-l
、より詳細な長いリストを表示できます。
出力の例として:
$ sleep 60 &
[1] 31441
$ ps -lp 31441
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 0 31441 31319 0 80 0 - 1423 hrtime pts/3 00:00:00 sleep
$ ps -fp 31441
UID PID PPID C STIME TTY TIME CMD
root 31441 31319 0 10:44 pts/3 00:00:00 sleep 60
ただし、これはヘッダーファイルを出力しますが、ログファイルには必要ない場合があります。-h
pidが1234の場合、オプションを使用してこれをトリミングできます。
ps -lhp 1234 >> /var/log/myapp/myapp.log 2>&1
>>
ログファイルに追加するためにを使用して出力をリダイレクトしたことに注意してください。
tail -n+1
(GNUが必要ですが、QはLinux / Ubuntuでした)。またはps -h{f,l}p 1234
(GNUでも)問題を回避します。
tail -n1
Ubuntuで確実に動作しますが、なぜ+
必要なのですか?
tail -n+2
が最初のものを除くすべての行を表示することを示唆することを意図したと思う tail -n1
最後の行だけを表示します。比較:seq 1 10 | tail -n+2
など。
-h
。不要なパイプや余分なプロセスを回避するために、彼のアドバイスを含めるように編集した。
を使用ps -f
すると、引数リストを確認したり、任意のファイルにリダイレクトしたりできます。
したがって、この場合は、 ps -ef | grep 1234 > myapp.log
このps manページを確認してください。
ps -ef | grep 'foo' | grep -v grep
grep -v
:私はこのトリックを使うgrep '123[4]'
lsof
プロセスのリダイレクト先を検出するために使用する+1myapp.log