Saya tahu bahwa saya dapat menambahkan &
perintah untuk menjalankan proses di latar belakang.
Saya SSH'ing ke kotak Ubuntu 12.04 dan menjalankan program python dengan $python program.py &
- tetapi ketika saya pergi untuk menutup jendela terminal saya mendapat pesan yang mengatakan bahwa menutup terminal akan mematikan proses yang sedang berjalan.
Kenapa ini? Saya menggunakan ampersand untuk menjalankan proses di latar belakang. Bagaimana saya bisa menjalankannya terlepas dari apakah saya menggunakan SSH?
Jawaban:
Ketika Anda menutup jendela terminal, emulator terminal mengirimkan SIGHUP ke proses yang sedang berjalan, shell Anda. Shell Anda kemudian meneruskan SIGHUP ke semua yang sedang berjalan. Di sistem lokal Anda, ini ssh. Ssh kemudian meneruskan SIGHUP ke apa yang sedang berjalan, shell jarak jauh. Jadi remote shell Anda kemudian mengirimkan SIGHUP ke semua prosesnya, program latar belakang Anda.
Ada 2 cara untuk mengatasi ini.
disown
perintah setelah latar belakang proses Anda. Ini akan membuat shell melupakannya.nohup
(nohup $python program.py &
). Ini mencapai hal yang sama, tetapi dengan menggunakan proses perantara. Pada dasarnya itu mengabaikan sinyal SIGHUP, dan kemudian bercabang & mengeksekusi program Anda yang mewarisi pengaturan, dan kemudian keluar. Karena bercabang, program yang diluncurkan bukan anak dari shell, dan shell tidak tahu tentang hal itu. Dan kecuali itu menginstal penangan sinyal untuk SIGHUP, itu tetap membuat tindakan abaikan.logout
alih-alih menutup jendela terminal. Saat Anda menggunakanlogout
, ini bukan SIGHUP, sehingga shell tidak akan mengirim SIGHUP ke anak-anaknya.Selain itu Anda harus memastikan bahwa program Anda tidak menulis ke terminal melalui STDOUT atau STDERR, karena keduanya tidak akan ada lagi setelah terminal keluar. Jika Anda tidak mengarahkan mereka ke sesuatu seperti
/dev/null
, program akan tetap berjalan, tetapi jika ia mencoba menulis kepada mereka, itu akan mendapatkan SIGPIPE, dan tindakan default SIGPIPE adalah menghentikan proses).sumber
ssh
mati menyebabkan koneksi turun, koneksi untuk menjatuhkan menyebabkansshd
di ujung yang lain mati. Sshd yang mengendalikan sisi master terminal pseudo yang dijalankan oleh shell jauh, ketika mati, itu adalah hang-up (seperti menarik steker pada terminal nyata), sehingga sistem mengirimkan SIGHUP ke shell jauh.nohup
menghasilkannohup.out
file dengan output dari program yang Anda mulai dengannya. Mungkin menjengkelkan untuk menghapus file itu setiap kali Anda menggunakan nohup untuk memulai aplikasi dengan cara ini (atau Anda perlu mengarahkan ulang hasilnya ke/dev/null
).nohup python program.py &
saya merekomendasikan menggunakansetsid python program.py
sebagai gantinya, yang segera menolak program.Proses sedang berjalan di latar belakang di terminal, tetapi output dari
stdout
(danstderr
) masih dikirim ke terminal. Untuk menghentikan ini, tambahkan> /dev/null 2>&1
sebelum&
untuk mengalihkan kedua output ke/dev/null
- menambahkandisown
juga memastikan proses tidak terbunuh setelah Anda menutup terminal:Dalam kasus Anda ini adalah:
sumber
The
&
memisahkan Operator perintah untuk menjalankan secara paralel, seperti;
memisahkan perintah untuk menjalankan dalam seri. Kedua jenis perintah masih akan berjalan sebagai anak dari proses shell .Jadi, ketika Anda menutup cangkang yang memulai anak-anak, anak-anak akan ditutup juga.
Apa yang tampaknya Anda inginkan adalah proses daemon , yang secara signifikan lebih rumit karena perlu memisahkan sepenuhnya dari proses induk. Shell biasanya tidak memiliki cara sederhana untuk melakukan itu.
sumber
Saat Anda logout, proses latar belakang yang terkait dengan sesi login biasanya juga dimatikan. Jika Anda ingin mereka terputus dari sesi, jalankan dengan
nohup
.sumber
Setelah perintah berakhir dengan ampersand (
&
), pada prompt perintah jalankan perintahbg
:Ini akan menempatkan perintah "&" ke latar belakang
Ini akan mencantumkan pekerjaan yang berjalan di latar belakang
Ini akan membawa Ayub # 1 ke latar depan
Cara lain, (untuk bisa keluar)
Beberapa baris dapat dikirimkan ke
at
perintah, sebelum ^ d (Control-D)lihat
man at
.sumber