Pertanyaan Bawa pekerjaan nohup ke foreground


Pertimbangkan yang berikut ini nohup eksekusi:

nohup script.sh > script.out &

Apakah ada cara untuk mematikan terminal, menyambungkan kembali, membawa proses kembali ke latar depan dan berinteraksi dengannya menggunakan keyboard?


13
2017-08-17 16:06


asal




Jawaban:


Jika Anda ingin memulai skrip, jalankan skrip tanpa keluaran mengganggu terminal Anda dan kemudian bawa ke atas nanti untuk berinteraksi dengannya, Anda mungkin ingin melihat multiplekser terminal. Tergantung pada sistem Anda, saya akan merekomendasikan tmux atau screen. Anda dapat menemukan beberapa info tentang cara menggunakannya di tautan di bawah:

tmux:

layar:

edit: menambahkan tautan untuk tmux primer


7
2017-08-17 16:16



+1 Alat luar biasa yang tidak saya ketahui. Terimakasih banyak. - Adam Matan


nohup tidak memutus perintah dari terminal, itu membuat script Anda diabaikan SIGHUP, dan pengalihan stdout/stderr ke file nohup.out, agar perintah dapat terus berjalan di latar belakang setelah Anda logout.

nohup tidak secara otomatis meletakkan perintah itu berjalan di latar belakang. Seseorang harus melakukan itu secara eksplisit, dengan mengakhiri baris perintah dengan sebuah &.

$ nohup ./script.sh &
[1] 3390
$ nohup: ignoring input and appending output to ‘nohup.out’

jobs dapat mencetak pekerjaan yang sedang berjalan dan status mereka. Jika perintah jobs tidak dapat menemukannya, maka itu tidak lagi proses anak dari shell itu.

$ jobs 
[1]+  Running                 nohup ./script.sh &

Satu dapat membawa kembali pekerjaan latar belakang ke latar depan dalam bash menggunakan fg bahkan jika itu dijalankan nohup. Tapi itu tidak akan mengubah output redirection, yang masih akan menuju ke file nohup.out.

$ fg
nohup ./script.sh

Jika Anda menutup shell / terminal atau log off, perintah Anda bukan lagi anak dari shell itu. Itu milik init proses. Jika Anda mencari di pstree Anda akan melihatnya sekarang dimiliki oleh proses 1 (init). Itu tidak bisa dibawa kembali ke latar depan karena latar depan tidak ada lagi.


16
2018-01-19 17:42



If the command jobs cannot find it, then it is no longer a child process of that shell.Ini salah: cobalah urutan ini untuk melihat caranya: sleep 100 & disown ; echo Jobs:; jobs; echo Tree:; pstree -ap $$. Setelah perintah ini Anda masih akan melihat sleep bekerja dengan PID yang sama dicetak saat Anda menelurkannya, sementara jobs tidak akan mencetak apa pun. Satu-satunya cara proses anak dapat berhenti menjadi anak adalah kehilangan induknya (kemudian anak yatim menjadi anak dari init) atau forking + keluar (tapi kemudian PID berubah, jadi itu bukan anak asli). - Ruslan


Saya akan kedua menggunakan multiplexer terminal, tapi tmux, bukan layar. Layar adalah, untuk semua maksud dan tujuan, tidak terawat. Kon fi rmasinya adalah seni gelap, kemungkinan pertama kali tercatat dalam lampiran Necronomicon. Mencoba menulis konfigurasi Anda sendiri adalah sekilas tentang Cthulu. Serius Lihatlah orang-orang file .screenrc. Yang pasti, ada cara untuk memediasi kekejian layar dari config flle. Byobu melakukan pekerjaan yang mengagumkan sebagai cadar antara pengguna fana dan kode tidak suci. Muncul dengan warna yang masuk akal, antarmuka menu, dan mungkin yang paling penting, bilah status.

Tapi seperti yang saya katakan, saya sarankan tmux sebagai gantinya. Masih membutuhkan beberapa konfigurasi kecil, tetapi itu didokumentasikan dengan baik, dan file konfigurasi Anda tidak akan terlihat seperti omong kosong. Juga, Anda mulai dengan warna dan bilah status. Bandingkan file screenrc dan tmux.conf saya:


3
2017-08-17 18:38





Jika Anda hanya tertarik untuk mencari topi hidup, keluaran ini mungkin cocok untuk Anda:

nohup script.sh 2>&1 script.out &
# later:
tail -f script.out

0
2017-08-17 21:20