1. ホーム
  2. linux

[解決済み] コマンドラインを使用して、起動後のプロセスのSTDERR / STDOUTをリダイレクトする?

2022-06-07 09:57:55

質問

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

私がこの質問をすることになった経緯は、私のターミナルのバックグラウンドで実行されているプログラムが、迷惑なテキストを出力し続けるというものです。それは重要なプロセスなので、私はテキストを避けるために別のシェルを開く必要があります。私は、次のことができるようにしたいと思います。 >/dev/null または他のリダイレクトができるようにして、同じシェルで作業を続けることができるようにしたいです。

どのように解決するのですか?

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 新しい SSH/telnet/etc セッションを開くことなく、複数の仮想 TTY を切り替えられる画面です。
  • を使用して nohup これにより、...プロセスのバックグラウンドプロセスを失うことなくセッションを閉じたり開いたりすることができます。