Nohup jauh setelah fakta dengan tcsh


11

Saya memiliki instance tcsh dalam xterm yang menjalankan proses jangka panjang (minggu?). Server Xvnc yang berjalan di bawahnya keluar di gulma; itu memakan CPU 100% dan tidak responsif. (Ini adalah bug yang dikenal dan saya tahu itu tidak dapat dipulihkan.)

Proses jangka panjang saat ini memblokir di stdout.

Apakah ada cara saya bisa membunuh proses yang mendasarinya - tcsh, xterm, apa pun - dan menjaga proses jangka panjang tetap berjalan?

(Tolong, tidak ada jawaban screen. Saya tahu. Ini bukan proses saya; ini adalah pengguna. Mereka tidak akan belajar.)

Jawaban:


17

Posting ini dapat membantu. Rekomendasi tersebut adalah:

  1. background proses (dengan Ctrl-Z, lalu bg )
  2. jalankan disown -h% [jobid] (kemungkinan bash-isme, jadi Anda harus menerjemahkan untuk tcsh)

The berita buruk , tentu saja, adalah bahwa bg akan perlu dilakukan dalam shell yang sama proses sedang berjalan di ... tapi ... itu mungkin sudah dilatarbelakangi.

Berita yang benar - benar buruk adalah bahwa panggilan penolakan mungkin perlu dilakukan di shell yang sama. Dalam hal ini, ya, Anda kacau. Tapi saya tidak yakin, mungkin root dapat memutuskan hubungan secara paksa.

Hmm. Kemungkinan kabar baik - tcsh melakukan penolakan otomatis:

Jika tcsh keluar secara tidak normal, ia menolak pekerjaan yang berjalan di latar belakang secara otomatis saat keluar.

Jadi, jika proses jangka panjang Anda sudah dilatar belakangi, membunuh orang tua tcsh-nya harus memungkinkan untuk melanjutkan. Proses sekarang terputus dari terminal awal. (Jika tidak, lihat "berita buruk" di atas.)

Sayangnya, ini bukan layar, jadi tidak ada koneksi ulang yang sebenarnya. Anda dapat memalsunya dengan gdb mungkin (sekali lagi, dari tautan pertama):

[...] dengan beberapa peretasan yang kotor, bukan tidak mungkin untuk membuka kembali proses 'stdout / stderr / stdin.

Jadi, Anda masih bisa membuat jendela layar kosong (misalnya yang menjalankan mode tidur).

Dan kemudian gunakan gdb misalnya untuk melampirkan ke proses, lakukan beberapa panggilan tutup (0)
panggilan tutup (1)
panggilan tutup (2)
panggilan terbuka ("/ dev / pts / xx", ...)
panggilan dup (0)
panggilan dup (0)
lepaskan

Output proses akan menuju ke layar. Itu tidak akan dilampirkan ke terminal layar itu, jadi misalnya [sic] akan membunuh perintah "sleep", bukan prosesnya, tetapi itu bisa cukup untuk OP.

Saya ingin tahu apakah seharusnya tidak ada "panggilan dup (1)" dan "panggilan dup (2)" dalam proses itu juga ...


Ya, ini adalah proses latar depan, jadi saya kira saya kacau.
wfaulk

Ya. tetapi seperti yang Anda katakan, itu bukan proses Anda, bukan kesalahan Anda. maaf Anda terjebak dengan kekacauan, tho.
Quack quixote

2
Ini benar-benar menyelamatkanku. Saya mengalami masalah yang sama dengan yang saya posting pada awalnya, yaitu prosesnya memblokir STDOUT ketika server X (dan, saya kira, xterm di antaranya) terjepit. Ternyata saya tidak benar-benar perlu melakukan apa pun kecuali menutup STDOUT. Keluaran itu tidak relevan; data sebenarnya ada di file log di suatu tempat. Jadi saya bisa melampirkan dengan gdb, jalankan "call close (1)" dan kemudian "cont" dan itu bergerak bersama lagi. Terima kasih banyak!
wfaulk

Hah! menarik. yang membekukan segalanya? Keanehan. senang itu membantu kamu!
quack quixote

2
Mungkin perlu menunjukkan bahwa mengirim "Ctrl-Z" ke proses latar depan dan mengirim SIGSTOP ke pid adalah hal yang sama. (SIGCONT memulai proses kembali.) Saya tidak tahu apakah ini akan membantu orang lain dalam situasi yang sama atau tidak, tetapi, dalam pengujian cepat saya, mengirim SIGSTOP diikuti oleh duplikat SIGCONT "Ctrl-Z" diikuti oleh bg.
wfaulk

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.