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
exitdi terminal SSH dempulDapatkah seseorang memberi saya skenario praktis di mana
nohupakan 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 ulangSIGHUPuntuk semua pekerjaan, berjalan atau
berhenti. Pekerjaan yang dihentikan dikirimSIGCONTuntuk 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.