Verifikasi perintah yang ditolak

10

Saya mengeluarkan ^z; bg; disownurutan 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)?

mikewaters
sumber
1
Saya ingin tahu apakah ini perlu ke unix.stackexchange.com
Rilindo
2
Hanya ingin tahu, mengapa tidak: $ PROSES 1 >> / root / std.out 2 >> / root / err.out &
Avery Payne

Jawaban:

12

Di Bash, disownperintah yang dikeluarkan dengan sendirinya akan menghapus proses berlatar belakang (melalui bgatau &) 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. The disown -hflag berguna jika Anda ingin menyimpan pekerjaan di meja, tapi masih tidak SIGHUP di logout.

Anda dapat melihat tabel pekerjaan dengan mengeluarkan jobsperintah. 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 melalui ps ux, topdan proses-melihat utilitas lain.

Setelah suatu pekerjaan ditolak, Anda dapat menunggu sampai pekerjaan itu berhenti secara alami atau mengirim sinyal killke 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:

# we start a command in the background
$ cat /dev/urandom > test &
[1] 18533

# we see our command is still running
$ jobs
[1]+  Running                 cat /dev/urandom > test &

# we disown the backgrounded job
$ disown 1

# notice it is no longer in the job table
$ jobs

Saya biasanya hanya menggunakan disownjika saya menjalankan perintah yang berpotensi berjalan lama seperti rsyncatau cpdan setelah itu memutuskan saya harus keluar tanpa menghentikannya. Jika Anda tahu Anda akan menjalankan perintah dan keluar, Anda dapat menangkap output dengan memiparkan atau teememasukkannya ke file, menjalankannya dengan nohup, atau menjalankannya screen(yang memungkinkan Anda untuk mengambil kembali kepemilikan perintah / mengakhiri setelah itu ).

Contoh:

# capture stdout and stderr to separate logs
cat /dev/urandom >stdout.log 2>stderr.log

# capture stdout and stderr to the same log, and display to stdout as well
cat /dev/urandom 2>&1 | tee output.log

# run a command under nohup (doesn't require a disown or job control support)
nohup cat /dev/urandom </dev/null
lunixbochs
sumber
1
+1 Informatif dan dengan contoh. Bagus!
Andy Smith
Komentar yang sangat informatif; apakah Anda mengatakan bahwa tidak mungkin memverifikasi detasemen suatu proses (selain mencatat bahwa itu tidak ada lagi di tabel pekerjaan)?
mikewaters
1
ketika Anda menjalankan detachpekerjaan latar belakang, itu akan terlepas :) sebenarnya tidak ada jalan tengah di mana menjalankannya pada proses latar belakang tidak akan melakukan apa-apa. memeriksa jobshanya memverifikasi Anda tidak mencoba melepaskan proses yang terhenti atau sesuatu.
lunixbochs