GNU/Linux >> Belajar Linux >  >> Linux

Redirect STDERR / STDOUT dari suatu proses SETELAH dimulai, menggunakan baris perintah?

Sebelum menutup dan membuka kembali tty Anda (yaitu log off dan kembali, yang juga dapat menghentikan beberapa proses latar belakang Anda dalam proses), Anda hanya memiliki satu pilihan tersisa:

  • lampirkan ke proses yang dimaksud menggunakan gdb, dan jalankan:
    • p dup2(buka("/dev/null", 0), 1)
    • p dup2(buka("/dev/null", 0), 2)
    • lepaskan
    • berhenti

mis.:

$ 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

Anda juga dapat mempertimbangkan:

  • menggunakan screen; screen menyediakan beberapa TTY virtual yang dapat Anda alihkan tanpa harus membuka sesi SSH/telnet/dll baru
  • menggunakan nohup; ini memungkinkan Anda untuk menutup dan membuka kembali sesi Anda tanpa kehilangan proses latar belakang apa pun dalam... proses.

Ini akan melakukan:

strace -ewrite -p $PID

Tidak sebersih itu (menampilkan baris seperti:write(#,<text you want to see>) ), tetapi berhasil!

Anda mungkin juga tidak menyukai fakta bahwa argumen disingkat. Untuk mengontrolnya gunakan -s parameter yang mengatur panjang maksimum string yang ditampilkan.

Itu menangkap semua aliran, jadi Anda mungkin ingin memfilternya:

strace -ewrite -p $PID 2>&1 | grep "write(1" 

hanya menampilkan deskriptor 1 panggilan. 2>&1 adalah mengarahkan ulang STDERR ke STDOUT, sebagai strace menulis ke STDERR secara default.


mempelajari penelitian luar biasa vladr (dan lainnya):

buat dua file berikut di direktori yang sama, sesuatu di jalur Anda, misalnya $HOME/bin:

silence.gdb, berisi (dari jawaban vladr):


p dup2(open("/dev/null",0),1)
p dup2(open("/dev/null",0),2)
detach
quit

dan hening, berisi:


#!/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

Sekarang, lain kali Anda lupa mengarahkan firefox, misalnya, dan terminal Anda mulai berantakan dengan pesan "(firefox-bin:5117):Gdk-WARNING **:XID collision, trouble front yang tak terhindarkan":


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

Anda juga dapat mengarahkan keluaran gdb ke /dev/null jika Anda tidak ingin melihatnya.


Linux
  1. Pengantar menggunakan tcpdump di baris perintah Linux

  2. Menggunakan kekuatan di baris perintah Linux

  3. Cara Membuat Database di MySQL Menggunakan Command Line

  1. Teks Gema Setelah Perintah Curl Pada Baris Yang Sama?

  2. Cara Reboot Linux Menggunakan Command Line

  3. Copot pemasangan Node.JS menggunakan baris perintah Linux?

  1. Cara Shutdown atau Reboot Linux menggunakan Command Line

  2. Redirect Semua Stderr Perintah Selanjutnya Menggunakan Exec?

  3. Bagaimana cara mengarahkan stderr dan stdout ke file berbeda di baris yang sama dalam skrip?