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
を使用;これにより、... プロセスのバックグラウンド プロセスを失うことなく、セッションを閉じて再度開くことができます。
これでできます:
strace -ewrite -p $PID
それほどきれいではありません (次のような行を示しています:write(#,<text you want to see>)
)、しかし動作します!
また、引数が省略されていることも気に入らないかもしれません。 -s
を使用して制御するには 表示される文字列の最大長を設定するパラメーター。
すべてのストリームをキャッチするので、何らかの方法でフィルタリングしたい場合があります:
strace -ewrite -p $PID 2>&1 | grep "write(1"
記述子 1 の呼び出しのみを示します。 2>&1
strace
のように、STDERR を STDOUT にリダイレクトします。 デフォルトで STDERR に書き込みます。
vladr (および他の人) の優れた研究の引用:
次の 2 つのファイルを同じディレクトリに作成します。たとえば、$HOME/bin のように、パスに何かを指定します。
含むsilence.gdb(vladrの回答から):
p dup2(open("/dev/null",0),1)
p dup2(open("/dev/null",0),2)
detach
quit
および沈黙。以下を含む:
#!/bin/sh
if [ "$0" -a "$1" ]; then
gdb -p $1 -x $0.gdb
else
echo Must specify PID of process to silence >&2
fi
chmod +x ~/bin/silence # make the script executable
次に、たとえば、Firefox をリダイレクトするのを忘れた場合、端末は避けられない "(firefox-bin:5117):Gdk-WARNING **:XID collision, trouble ahead" メッセージで混乱し始めます:
ps # look for process xulrunner-stub (in this case we saw the PID in the error above)
silence 5117 # run the script, using PID we found
見たくない場合は、gdb の出力を /dev/null にリダイレクトすることもできます。