Saya ingin tahu tujuan dari nohup
hari ini .
Saya bertanya karena saya membaca ini
Nohup adalah kependekan dari "No Hangup". Ini bukan perintah yang Anda jalankan dengan sendirinya. Nohup adalah perintah tambahan yang memberitahu sistem Linux untuk tidak menghentikan perintah lain setelah dimulai. Itu berarti itu akan terus berjalan sampai selesai, bahkan jika pengguna yang memulainya keluar. Sintaks untuk nohup sederhana dan terlihat seperti ini:
nohup sh your-script.sh &
Perhatikan tanda “&” di akhir perintah. Itu memindahkan perintah ke latar belakang, membebaskan terminal tempat Anda bekerja.
Nohup bekerja dengan hampir semua perintah yang Anda jalankan di terminal. Itu dapat dijalankan dengan skrip khusus serta perintah sistem standar dan utilitas baris perintah.
Dengan menggunakan distro linux seperti SLES 11.4, atau RHEL/CentOS 7.x, saya bisa
- login jarak jauh ke linux melalui jaringan melalui SSH
- jalankan program sederhana di bawah ini, atau yang lainnya, melakukan
./a.out &
- keluar dari linux; ketik exit di terminal SSH dempul
- contoh program saya di bawah ini, atau skrip shell lainnya termasuk bash, csh, atau tcsh, dijalankan sampai selesai dengan baik tanpa perlu
nohup
- mengetik exit di dempul untuk menutup sesi SSH, menurut saya itu memenuhi syarat sebagai logout?
Apakah ada tujuan atau nilai dengan nouhup
hari ini? Apakah ini kernel>=3.x? Selama yang saya ingat (kernel>=2.6) saya tidak pernah menggunakan nohup
dan selalu gunakan &
tanpa masalah.
Dapatkah seseorang memberi saya skenario praktis di mana nohup
akan digunakan?
#include <stdlib.h>
#include <stdio.h>
/*
sample C code, to print numbers to a file named zz.tmp
the numbers 0 to 29 over 30 seconds
*/
int main ( int argc, char *argv[] )
{
FILE *fp;
int i;
i = 0;
fp = fopen("zz.tmp", "w" );
while ( i < 30 )
{
fprintf( fp, "%dn", i++ );
sleep( 1 );
}
fclose( fp );
return 0;
}
mysleep.sh
#!/bin/bash
sleep 1000
Pada Centos 7.7, login pc optiplex dengan keyboard &mouse, akun saya adalah bash. Saya melakukan nohup ./mysleep.sh
lalu control-z . Saat mengetik jobs
Saya melihat [1]+ Stopped nohup ./mysleep.sh
Sebuah ps -ef | grep mysleep
menunjukkan id proses yang ada, tetapi jika saya menutup jendela terminal melalui X di sudut kanan atas, proses itu hilang sehingga tampaknya nohup
tidak berfungsi?
Jawaban yang Diterima:
login jarak jauh ke linux melalui jaringan melalui SSH … logout dari linux; ketik
exit
di terminal SSH dempulDapatkah seseorang memberi saya skenario praktis di mana
nohup
akan digunakan?
Tentu. Dengan asumsi Shell Anda adalah bash (lihat alasannya di bawah), alih-alih mengetik exit
atau ^D
, ketik ~.
di awal baris, yang akan menyebabkan klien ssh Anda terputus :
$ ssh localhost
ssh$ sleep 3600 &
[1] 5765
ssh$ ~.
ssh$ Connection to localhost closed.
$ ps 5765
PID TTY STAT TIME COMMAND
Anda dapat menggunakan program Anda alih-alih sleep
; dan alih-alih memutuskan sambungan melalui ~.
, Anda dapat mematikan klien ssh Anda atau merusak mesin yang dijalankannya. Anda ingin proses Anda bertahan dari ini? Gunakan nohup
Putusnya koneksi akan menyebabkan proses server yang mengelola ujung lainnya keluar, menyebabkan kernel (semua kernel Unix/Linux) meruntuhkan terminal-semu yang telah dibuat ssh, dan mengirim SIGHUP
sinyal ke pemimpin sesi (bash shell), yang menurut manual bash:
Shell keluar secara default setelah menerima
SIGHUP
. Sebelum keluar,
shell interaktif mengirim ulangSIGHUP
untuk semua pekerjaan, berjalan atau
berhenti. Pekerjaan yang dihentikan dikirimSIGCONT
untuk memastikan bahwa mereka menerimaSIGHUP
.
Banyak orang bingung dengan fitur bash dengan a) hal kontrol pekerjaan biasa yang diterapkan oleh kernel, yang hanya akan mengirim SIGCONT
/SIGHUP
pasangkan ke berhenti , bukan untuk berlari pekerjaan [1] dan b) fitur bash lainnya (shopt -s huponexit
) yang menyebabkan login bash shell untuk mengirim SIGHUP
ke pekerjaannya bahkan ketika keluar secara normal (mis. melalui exit
).
[1] a berhenti pekerjaan adalah pekerjaan (=grup proses) yang berisi setidaknya satu proses yang dihentikan. Sebuah proses dihentikan sebagai efek dari tindakan default sinyal seperti SIGTSTP
, SIGSTOP
, SIGTTIN
atau SIGTTOU
. Proses yang "tidur" pada panggilan sistem pemblokiran seperti read
, nanosleep
, select
, dll tidak dianggap berhenti, tetapi berjalan.
Mengapa nohup
mungkin tidak selalu membantu
nohup
hanya mengatur disposisi SIGHUP
untuk mengabaikan dan melakukan beberapa pengalihan, itu tidak menjamin bahwa proses tersebut tidak akan dihentikan dengan cara lain.
a) Jika nohup ..
pekerjaan dihentikan , bash interaktif juga akan mengirimkan SIGTERM
sinyal, bukan hanya SIGHUP
/SIGCONT
pasangan:
Jika upaya untuk keluar dari bash dilakukan saat pekerjaan dihentikan […] shell mencetak pesan peringatan [...] Jika upaya kedua untuk keluar dilakukan tanpa perintah intervensi, shell tidak mencetak peringatan lain, dan semua pekerjaan yang dihentikan akan dihentikan .
[dihentikan =mengirim SIGTERM
sinyal; ini adalah fitur ksh/bash lainnya, tidak ada di semua shell]
Semua ini dapat diatasi dengan trik sederhana seperti garpu ganda dan dengan membuat sesi baru dengan setsid(1)
, tapi
b) systemd
juga dapat “membersihkan” sesi log-out dengan mematikan paksa (dengan SIGTERM
diikuti oleh SIGKILL
) semua proses yang tersisa jika KillUserProcesses
pengaturan aktif, yang merupakan default di beberapa distro.