Apa yang terjadi pada output dari proses yang telah ditolak dan kehilangan terminalnya?

26

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.

rozcietrzewiacz
sumber
2
Untuk "bisakah saya mengambil output": bukan tanpa trik kotor. Tapi lihat Bagaimana saya bisa menolaknya proses yang sedang berjalan dan menghubungkannya ke shell layar baru? dan pertanyaan lain yang dikutip untuk trik kotor (semua didasarkan pada melampirkan debugger ke program dan entah bagaimana membuatnya membuka file output yang berbeda).
Gilles 'SO- stop being evil'
Terima kasih atas tautan ke pertanyaan itu. Itu memberi saya jawaban terbaik sejauh ini! Terutama rettyprogram yang pintar .
rozcietrzewiacz
1
Lihat juga jawaban ini pada pertanyaan terkait.
Stéphane Gimenez

Jawaban:

11

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/xperangkat 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 menggunakan fg/ bg/ jobsperintah 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).

Stéphane Gimenez
sumber
1
Terima kasih telah menjelaskan ini sedikit. Sebenarnya fakta menolak suatu proses masih terkait dengan pertanyaan saya: Setelah menolak suatu proses, saya tampaknya kehilangan kemampuan untuk mengontrol hasilnya, kan? (Bahkan jika terminal telah ditutup.) Saya akan mengedit pertanyaan untuk memasukkan kasus itu.
rozcietrzewiacz
4

Hanya untuk menjawab pertanyaan spesifik ini:

Jika saya menutup terminal virtual, di mana beberapa proses dimulai, apakah output langsung menuju / dev / null, atau bisakah itu mencemari memori entah bagaimana?

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).

Chris Page
sumber
Terima kasih - penjelasan yang bagus dan jelas dari sudut pandang pemrograman yang lebih sedikit.
rozcietrzewiacz
0

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 .

rozcietrzewiacz
sumber