GNU/Linux >> Linux の 問題 >  >> Linux

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

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 にリダイレクトすることもできます。


Linux
  1. 一定の時間が経過した後、コマンドラインからプロセスを停止/強制終了しますか?

  2. 同じ行のカールコマンドの後にテキストをエコーし​​ますか?

  3. スクリプトの同じ行で stderr と stdout を別のファイルにリダイレクトする方法は?

  1. Linuxコマンドラインでのtcpdumpの使用の概要

  2. Linuxコマンドラインで力を使用する

  3. コマンドラインを使用して相対時間を設定する

  1. コマンドラインを使用してLinuxをシャットダウンまたは再起動する方法

  2. Execを使用して後続のすべてのコマンドのStderrをリダイレクトしますか?

  3. Sedコマンドを使用した後にファイルを保存しますか?