起動済みプロセスのリダイレクト先を設定したい

  • プロセスをバックグラウンド実行させてログアウトしたら、制御端末がなくなるので、write 先がなくてエラーになる
  • リダイレクトするのを忘れた

というようなケースを想定。

screen を使ってるとか、リダイレクト先をちゃんと指定していればいいのだけど、うっかりはあるので。

stackoverflow に解決案があったのでメモ。

Redirect STDERR / STDOUT of a process AFTER it’s been started, using command line?
http://stackoverflow.com/questions/593724/redirect-stderr-stdout-of-a-process-after-its-been-started-using-command-lin

起動済みプロセスのリダイレクト先を設定する

アイデアは

  • GDB でプロセスにアタッチし
  • DUP(2) で stdout/stderr のファイルディスクリプタをコピーするというもの

フォアグラウンド実行したプロセスを例にした手順が gist で丁寧なコメント付きでまとめられているのでそちらを引用。

補足1:open のフラグ

gist の例では

touch /tmp/stdout # create empty stdout log
...
p dup2(open("/tmp/stdout", 1), 1)

というように touch して open のフラグで 1(O_WRONLY) を指定している。

p dup2(open("/tmp/stdout", 65, 0664), 1) # 65 = O_CREAT | O_WRONLY

のようにすれば、 touch を省ける。

補足2:kernel.yama.ptrace_scope

Ubuntu ではセキュリティ機構のために sudo しないとプロセスにアタッチできない

https://wiki.ubuntu.com/SecurityTeam/Roadmap/KernelHardening#ptrace

補足3:dupx プログラム

この一連の処理をさくっとやるために、 dupx というラッパーを作った人がいる
http://www.isi.edu/~yuri/dupx/

実行例

標準出力に write するプログラムをフォアグラウンド実行し、試してみる。

$ python test.py
^Z
[1]+  Stopped                 python test.py
$ bg
[1]+ python test.py &
$ jobs -l
[1]+ 16947 Running                 python test.py &
$ echo $! # PID of the most recent background command
16947
$ sudo gdb -p $!

Attaching to process 16947
Reading symbols from /usr/bin/python2.7...Reading symbols from /usr/lib/debug/usr/bin/python2.7...done.
done.
...
(gdb) p dup2(open("/tmp/stdout", 65, 0664), 1)
$1 = 1
(gdb) p dup2(open("/tmp/stderr", 65, 0664), 2)
$2 = 2
(gdb) detach
Detaching from program: /usr/bin/python2.7, process 16947
(gdb) quit

ログアウトを実行後、別ターミナルからプロセスを確認

$ ps x
  PID TTY      STAT   TIME COMMAND
16947 ?        S      0:00 python test.py
18396 pts/0    R+     0:00 ps x
...

TTY 列が ? で表示され、確かに制御端末はない。

リダイレクト先の /tmp/stdouttail すると、 write されているのを確認できる。

Hacker News Link : https://news.ycombinator.com/item?id=2110636

Advertisements
Tagged with: , ,
Posted in linux

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Archives
  • RT @__apf__: How to write a research paper: a guide for software engineers & practitioners. docs.google.com/presentation/d… /cc @inwyrd 4 months ago
  • RT @HayatoChiba: 昔、自然と対話しながら数学に打ち込んだら何かを悟れるのではと思いたち、専門書1つだけ持ってパワースポットで名高い奈良の山奥に1週間籠ったことがある。しかし泊まった民宿にドカベンが全巻揃っていたため、水島新司と対話しただけで1週間過ぎた。 それ… 5 months ago
  • RT @googlecloud: Ever wonder what underwater fiber optic internet cables look like? Look no further than this deep dive w/ @NatAndLo: https… 5 months ago
  • @ijin UTC+01:00 な時間帯で生活しています、、、 10 months ago
  • RT @mattcutts: Google's world-class Site Reliability Engineering team wrote a new book: amazon.com/Site-Reliabili… It's about managing produc… 1 year ago
%d bloggers like this: