コマンドラインを使用して、プロセスの開始後にプロセスの STDERR / STDOUT をリダイレクトしますか? 質問する

コマンドラインを使用して、プロセスの開始後にプロセスの STDERR / STDOUT をリダイレクトしますか? 質問する

シェルではリダイレクト> <などを行うことができますが、プログラムが起動した後はどうでしょうか?

私がこの質問をするようになったきっかけは、端末のバックグラウンドで実行されているプログラムが、迷惑なテキストを出力し続けていることです。これは重要なプロセスなので、テキストを回避するには別のシェルを開かなければなりません。>/dev/null同じシェルで作業を続けられるように、他のリダイレクトができるようにしたいと思います。

ベストアンサー1

tty を閉じて再度開く (つまり、ログオフして再度ログインする。これにより、プロセス中のバックグラウンド プロセスの一部も終了する可能性があります) 以外に、残された選択肢は 1 つだけです。

  • gdb を使用して問題のプロセスにアタッチし、次を実行します。
    • p dup2(open("/dev/null", 0), 1)
    • p dup2(open("/dev/null", 0), 2)
    • 切り離す
    • やめる

例えば:

$ tail -f /var/log/lastlog &
[1] 5636

$ ls -l /proc/5636/fd
total 0
lrwx------ 1 myuser myuser 64 Feb 27 07:36 0 -> /dev/pts/0
lrwx------ 1 myuser myuser 64 Feb 27 07:36 1 -> /dev/pts/0
lrwx------ 1 myuser myuser 64 Feb 27 07:36 2 -> /dev/pts/0
lr-x------ 1 myuser myuser 64 Feb 27 07:36 3 -> /var/log/lastlog

$ gdb -p 5636
GNU gdb 6.8-debian
Copyright (C) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Attaching to process 5636
Reading symbols from /usr/bin/tail...(no debugging symbols found)...done.
Reading symbols from /lib/librt.so.1...(no debugging symbols found)...done.
Loaded symbols for /lib/librt.so.1
Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/libpthread.so.0...(no debugging symbols found)...done.
[Thread debugging using libthread_db enabled]
[New Thread 0x7f3c8f5a66e0 (LWP 5636)]
Loaded symbols for /lib/libpthread.so.0
Reading symbols from /lib/ld-linux-x86-64.so.2...(no debugging symbols found)...done.
Loaded symbols for /lib64/ld-linux-x86-64.so.2

(no debugging symbols found)
0x00007f3c8eec7b50 in nanosleep () from /lib/libc.so.6

(gdb) p dup2(open("/dev/null",0),1)
[Switching to Thread 0x7f3c8f5a66e0 (LWP 5636)]
$1 = 1

(gdb) p dup2(open("/dev/null",0),2)
$2 = 2

(gdb) detach
Detaching from program: /usr/bin/tail, process 5636

(gdb) quit

$ ls -l /proc/5636/fd
total 0
lrwx------ 1 myuser myuser 64 Feb 27 07:36 0 -> /dev/pts/0
lrwx------ 1 myuser myuser 64 Feb 27 07:36 1 -> /dev/null
lrwx------ 1 myuser myuser 64 Feb 27 07:36 2 -> /dev/null
lr-x------ 1 myuser myuser 64 Feb 27 07:36 3 -> /var/log/lastlog
lr-x------ 1 myuser myuser 64 Feb 27 07:36 4 -> /dev/null
lr-x------ 1 myuser myuser 64 Feb 27 07:36 5 -> /dev/null

以下も検討してください:

  • 使用法screen; screen は、新しい SSH/telnet/etc セッションを開かずに切り替えることができる複数の仮想 TTY を提供します。
  • を使用するとnohup、プロセス内のバックグラウンド プロセスを失うことなく、セッションを閉じて再度開くことができます。

おすすめ記事