次のコマンドでプロセスを実行したとします。
myapp -e -c -f myapp.config > /var/log/myapp/myapp.log 2>&1
しばらくすると、プロセス(例:1234)pid
のみが表示されmyapp
ます。 だけで、すべてのフラグを使用してコマンドを取得し、出力をmyapp.log
何らかの方法でリダイレクトする方法はありますかpid
?
答え1
ps -o args= -p "$pid"
プロセスがその後引数リストを上書きしない限り、プロセスが最後に実行したコマンド (または、何も実行しなかった場合は、その親が実行したコマンド) に与えられた引数リストが通知されます。
ps
ps
は、スペースで連結された引数リストと、いくつかのオプションを追加することで実装によって引き上げられる可能性のある制限を表示します-w
。Linux では、 で NUL バイトで区切られた引数リストが表示されます/proc/$pid/cmdline
。
lsof +fg -ap "$pid" -d 0-2
プロセスの stdin、stdout、stderr ファイル記述子が何を指しているか、およびそれらが開かれたモード ( POSIX シェルでリダイレクトが使用されたW,AP
かのように、追加による書き込み専用など)がわかります。>>
答え2
ps
コマンドを使用し、-p
スイッチで調べる pid を指定すると、-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
ただし、これにより、ログ ファイルには不要なヘッダー行が出力されます。pid-h
が 1234 の場合は、オプションを使用してこれをトリミングできます。
ps -lhp 1234 >> /var/log/myapp/myapp.log 2>&1
出力を にリダイレクトして、>>
ログファイルに追加したことに注意してください。
答え3
を使用するとps -f
、引数リストを確認したり、任意のファイルにリダイレクトしたりすることができます。
この場合はps -ef | grep 1234 > myapp.log
ご確認くださいps マニュアルページ。