GNU/Linux >> Belajar Linux >  >> Linux

Kapan Menggunakan Nohup?

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 dempul

Dapatkah 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

Terkait:Debian – Mengapa 'ls' tiba-tiba membungkus item dengan spasi dalam tanda kutip tunggal?

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 ulang SIGHUP untuk semua pekerjaan, berjalan atau
berhenti. Pekerjaan yang dihentikan dikirim SIGCONT untuk memastikan bahwa mereka menerima SIGHUP .

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.


Linux
  1. Kapan Saya Harus Menggunakan Trailing Slash Pada Direktori??

  2. Kapan Dan Mengapa Saya Harus Menggunakan Pembaruan Apt-get?

  3. Kapan harus menggunakan Server Khusus

  1. Kapan menggunakan Bash dan kapan menggunakan Perl/Python/Ruby?

  2. Penggunaan / saat menggunakan cd

  3. penundaan ssh saat menghubungkan

  1. Ssh – Membatasi Pengguna Ssh/scp/sftp ke Direktori?

  2. Bagaimana cara mengetahui apakah koneksi ssh ControlMaster sedang digunakan

  3. Ubah direktori default saat saya SSH ke server