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.