Jika saya menutup terminal virtual, di mana beberapa proses dimulai, apakah output langsung pergi ke /dev/null
, atau bisakah itu mencemari memori entah bagaimana?
Bisakah saya mengambil output untuk terus membacanya kapan saja setelah itu?
[EDIT]: Jadi, apakah momen penolakan suatu proses secara efektif merupakan akhir dari kekuatan saya untuk mengontrol hasilnya?
Saya juga memperhatikan, bahwa jika saya menolak proses yang terhenti, pada awalnya semuanya tampak normal: tidak dihentikan atau ditampilkan dalam pekerjaan. Tetapi jika saya logout (dan maksud saya bukan menutup terminal, hanya keluar dari su
, misalnya), proses dihentikan. Semua sama, proses pembatalan yang berjalan di latar belakang dapat tetap berjalan.
terminal
process
io-redirection
job-control
disown
rozcietrzewiacz
sumber
sumber
retty
program yang pintar .Jawaban:
Fakta bahwa suatu proses "tidak diakui" hanya memiliki makna untuk shell interaktif yang menciptakan proses ini. Ini berarti bahwa shell tidak termasuk (lagi) proses dalam tabel pekerjaannya, dan bahwa SIGHUP tidak akan dikirim ke proses ini ketika shell keluar. Itu tidak benar-benar terkait dengan pertanyaan Anda.
Tentang apa yang terjadi pada output yang dikirim ke terminal virtual yang dihapus: Saya membuat beberapa tes sendiri, dan saya perhatikan bahwa
/dev/pts/x
perangkat tidak dapat diakses, dan tidak akan dialokasikan lagi sampai semua pengarsiptor yang menunjuk ke mereka telah ditutup. Jadi, saya tidak dapat melihat alasan mengapa penulisan ke terminal yang dihapus akan disimpan. Saya kira ini bahkan tidak didefinisikan oleh POSIX.Tentang mengambil output dari beberapa proses yang menulis ke terminal, saya rasa itu tidak mungkin, bahkan ketika terminal masih hidup¹. Yang dapat Anda lakukan adalah meraih input langsung ke terminal (yaitu penekanan tombol, atau penekanan tombol simulasi oleh bagian master dari pty). Jika proses akan membaca pada stdin apa yang ditulis ke terminal mereka, itu akan mengarah ke loop io diri untuk sebagian besar proses.
Tentang komentar terakhir tentang penghentian proses, saya tidak benar-benar tahu apa yang terjadi, tetapi saya akan curiga perilaku yang agak aneh dengan sinyal (SIGTTOU, SIGTTIN, SIGHUP, atau yang lain) terkait dengan keadaan latar depan / latar belakang kelompok proses, ketika sesi pemimpin keluar (misalnya
su
, dalam kasus yang Anda sebutkan).Jawaban untuk Edit: Tidak, sehubungan dengan output, tidak ada yang berubah ketika suatu proses tidak diakui: ia masih melekat pada terminal pengontrolnya (kecuali jika sudah terlepas seperti yang dilakukan daemon). Anda dapat melihat itu menggunakan
ps
. Namun, Anda tidak akan dapat menggunakanfg
/bg
/jobs
perintah yang disediakan oleh shell lagi untuk proses ini. Itu berarti mungkin sulit untuk mengisinya dengan input dari terminal (harus berada dalam kelompok proses latar depan).-
1. kecuali jika prosesnya mau, atau dibajak dengan beberapa alat debugging (lihat komentar di atas).
sumber
Hanya untuk menjawab pertanyaan spesifik ini:
Terminal dan program yang terhubung dengannya berkomunikasi melalui perangkat tty dengan membaca dan menulisnya seperti file. Khususnya, terminal virtual membuat "pseudo-tty" ("pty" singkatnya) dan kemudian memunculkan proses shell (atau lainnya) dan menghubungkan stdin / out / err dari proses itu ke pty. (Detailnya bervariasi berdasarkan sistem operasi.)
Ketika Anda menutup terminal virtual, terminal virtual menutup ujung koneksi (pty "master"). Setelah itu, jika program di ujung koneksi menulis ke tty, kesalahan dikembalikan dan data tidak ke mana-mana. Demikian pula, jika terbaca dari tty maka akan mendapatkan kembali indikator EOF (akhir file).
sumber
Untuk menjawab bagian paling menarik dari pertanyaan Anda: untuk mengubah output dari program yang sedang berjalan, Anda harus mengedit deskriptor file-nya. Itu cukup mudah dilakukan dengan gdb. Ini hack, tapi berhasil.
Lihat:
/programming/593724/redirect-stderr-stdout-of-a-process-after-its-been-started-using-command-line
Skrip pembantu tersedia di http://users.linpro.no/ingvar/fdswap.sh.txt .
sumber
Berkat komentar oleh Gilles, mengarahkan saya ke pertanyaan ini , saya belajar tentang program yang disebut retty .
Tampaknya menggunakan beberapa hack kotor untuk memasang kembali ke (pseudo-) tty secara efektif memungkinkan untuk terus membaca output dari suatu proses - tidak peduli apakah itu telah ditolak atau tidak. Jadi ini sepertinya menjawab sebagian besar bagian pertama dari pertanyaan saya. Yang kedua dijawab oleh Stéphane .
sumber