Saya mengeluarkan ^z; bg; disown
urutan untuk memungkinkan saya untuk menutup sesi ssh di mana saya menjalankan proses jangka panjang yang sangat penting. Proses ini menulis keluaran status ke stderr, dan terus melakukannya bahkan setelah terlepas (diverifikasi dengan lsof, stderr fd terbuka untuk r / w).
Apakah ada cara untuk menentukan bahwa prosesnya memang telah ditolak (tidak akan memulihkan SIGHUP jika shell mendapatkannya kembali)?
Jawaban:
Di Bash,
disown
perintah yang dikeluarkan dengan sendirinya akan menghapus proses berlatar belakang (melaluibg
atau&
) dari tabel pekerjaan aktif, dan menandainya untuk tidak menerima SIGHUP saat logout.Anda juga dapat melewati satu atau beberapa pekerjaan untuk ditolak, seperti
disown 1 3
. Thedisown -h
flag berguna jika Anda ingin menyimpan pekerjaan di meja, tapi masih tidak SIGHUP di logout.Anda dapat melihat tabel pekerjaan dengan mengeluarkan
jobs
perintah. Setelah latar belakang yang sukses, itu akan ditampilkan[1]+ command &
. Setelah menyangkal pekerjaan, seharusnya tidak lagi ditampilkan di tabel pekerjaan, dan tidak lagi terbunuh saat keluar. Anda masih bisa melihat proses melaluips ux
,top
dan proses-melihat utilitas lain.Setelah suatu pekerjaan ditolak, Anda dapat menunggu sampai pekerjaan itu berhenti secara alami atau mengirim sinyal
kill
ke PID untuk menghentikannya.Karena Bash hanya menghapus pekerjaan dari daftar pekerjaan yang sedang berjalan untuk diakhiri dan file menangani ke stdout dan stderr terminal Anda masih terbuka, Anda akan terus menerima output dari pekerjaan itu sampai perangkat terminal Anda ditutup (ketika Anda logout) .
Contoh:
Saya biasanya hanya menggunakan
disown
jika saya menjalankan perintah yang berpotensi berjalan lama sepertirsync
ataucp
dan setelah itu memutuskan saya harus keluar tanpa menghentikannya. Jika Anda tahu Anda akan menjalankan perintah dan keluar, Anda dapat menangkap output dengan memiparkan atautee
memasukkannya ke file, menjalankannya dengannohup
, atau menjalankannyascreen
(yang memungkinkan Anda untuk mengambil kembali kepemilikan perintah / mengakhiri setelah itu ).Contoh:
sumber
detach
pekerjaan latar belakang, itu akan terlepas :) sebenarnya tidak ada jalan tengah di mana menjalankannya pada proses latar belakang tidak akan melakukan apa-apa. memeriksajobs
hanya memverifikasi Anda tidak mencoba melepaskan proses yang terhenti atau sesuatu.