Bawa pekerjaan nohup ke latar depan

14

Pertimbangkan nohupeksekusi berikut :

nohup script.sh > script.out &

Apakah ada cara untuk keluar dari terminal, menghubungkan kembali, membawa proses kembali ke latar depan dan berinteraksi dengannya menggunakan keyboard?

Adam Matan
sumber

Jawaban:

7

Jika Anda ingin memulai skrip, menjalankannya tanpa output mengganggu terminal Anda dan kemudian membawanya untuk berinteraksi dengannya, Anda mungkin ingin melihat pada terminal multiplexer. Tergantung pada sistem Anda, saya akan merekomendasikan tmuxatau screen. Anda dapat menemukan beberapa info tentang cara menggunakannya di tautan di bawah:

tmux:

layar:

edit: tautan yang ditambahkan untuk primer tmux

Gus E
sumber
+1 Alat luar biasa yang saya tidak tahu. Terimakasih banyak.
Adam Matan
19

nohup tidak memutuskan perintah dari terminal, itu membuat skrip Anda diabaikanSIGHUP, dan mengalihkanstdout/stderrke filenohup.out, sehingga perintah dapat terus berjalan di latar belakang setelah Anda logout.

nohuptidak secara otomatis menempatkan perintah yang dijalankan di latar belakang. Seseorang harus melakukan itu secara eksplisit, dengan mengakhiri baris perintah dengan &.

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

jobsdapat mencetak pekerjaan yang sedang berjalan dan statusnya. Jika perintah jobstidak dapat menemukannya, maka itu bukan lagi proses anak dari shell itu.

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

Seseorang dapat mengembalikan pekerjaan latar ke latar depan di bash menggunakan fgbahkan jika dijalankan dengan nohup. Tetapi itu tidak akan mengubah redirection output, yang masih akan pergi ke filenohup.out .

$ fg
nohup ./script.sh

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

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

Saya akan menggunakan kedua terminal multiplexer, tetapi tmux , bukan layar. Layar, untuk semua maksud dan tujuan, tidak dipelihara. Konfigurasi ini adalah seni gelap, kemungkinan pertama kali direkam dalam lampiran Necronomicon. Mencoba untuk menulis konfigurasi Anda sendiri adalah sekilas Cthulu. Serius. Lihat-lihat file .screenrc orang . Yang pasti, ada beberapa cara untuk menengahi kekecewaan layar terhadap konfigurasi. Byobu melakukan pekerjaan yang mengagumkan sebagai tabir antara pengguna fana dan kode yang tidak suci. Muncul dengan warna yang masuk akal, antarmuka menu, dan mungkin yang paling penting, status bar.

Tapi seperti yang saya katakan, saya sarankan tmux sebagai gantinya. Ini masih memerlukan beberapa konfigurasi kecil, tetapi sudah didokumentasikan dengan baik , dan file konfigurasi Anda tidak akan terlihat seperti omong kosong. Anda juga mulai dengan warna dan bilah status. Bandingkan file screenrc dan tmux.conf saya:

djeikyb
sumber
0

Jika Anda hanya tertarik untuk mencari topi langsung, hasilnya mungkin cocok untuk Anda:

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

Perintah Linux apa pun dapat dikirim ke latar belakang dengan ' &' ditambahkan pada akhirnya.

Untuk melihat semua pekerjaan latar belakang, Anda dapat menerbitkan jobs

jobs
[1]  + suspended  nohup sh zookeeper-server-start.sh ../config/zookeeper.properties
[2]    running    nohup sh kafka-server-start.sh ../config/server.properties
[3]  - running    nohup sudo mongod --dbpath=/var/lib/mongodb

Di sini saya menjalankan 3 pekerjaan di latar: zookeeper, kafka, dan mongo daemon. [1], [2] dan [3] adalah nomor pekerjaan masing-masing untuk tugas ini.

Anda dapat membawa tugas-tugas tersebut ke latar depan menggunakan fg %$taskNumber.

Sudip Bhandari
sumber