Mengapa wget saya tidak mati setelah kehilangan koneksi ssh?

13

Saya sshmengedit ke server saya dan berlari wget -r -np zzz.aaa/bbb/cccdan mulai bekerja. Kemudian koneksi internet saya (di rumah saya) terputus dan saya khawatir dengan anggapan bahwa wgetitu hupped karena sshkoneksi terputus dan terminal mati. Tapi kemudian saya sshmengedit ke server saya dan menyadari bahwa itu masih berjalan dan memasukkan output wget.logdan mengunduh barang. Bisakah seseorang tolong jelaskan kepada saya apa yang mungkin terjadi di sini?

Inilah yang psmemberi saya:

PID   %CPU %MEM    VSZ    RSS TTY     STAT START   TIME COMMAND
32283  0.6 29.4 179824 147088 ?       S    14:00   1:53 wget -r -np zzz.aaa/bbb/ccc

Apa artinya (tanda tanya) ?di kolom tty?

yukashima huksay
sumber
Perhatikan bahwa pada sistem modern yang berjalan logind, perilaku default logindadalah untuk membunuh (SIGTERM) semua proses milik pengguna ketika pengguna logout. Jadi perilaku ini khusus untuk sistem.
Daniel Pryden
@Dan Sistem saya ubuntu 16.04
yukashima huksay
2
Saya percaya Ubuntu 16.04 adalah sistem systemd / logind, tetapi default logind.conf Ubuntu ditetapkan secara eksplisit KillUserProcesses=no.
Daniel Pryden

Jawaban:

21

Program (dan skrip) dapat memilih untuk mengabaikan sebagian besar sinyal, kecuali beberapa yang suka KILL. The HUPsinyal dapat ditangkap dan diabaikan jika perangkat lunak sehingga ingin.

Ini dari src/main.csatu wgetsumber (versi 1.19.2):

/* Hangup signal handler.  When wget receives SIGHUP or SIGUSR1, it
   will proceed operation as usual, trying to write into a log file.
   If that is impossible, the output will be turned off.  */

Sedikit lebih jauh ke bawah pengendali sinyal diinstal:

  /* Setup the signal handler to redirect output when hangup is
     received.  */
  if (signal(SIGHUP, SIG_IGN) != SIG_IGN)
    signal(SIGHUP, redirect_output_signal);

Jadi sepertinya wgettidak mengabaikan para HUPsinyal, tetapi memilih untuk terus memproses dengan output diarahkan ke file log.


Diminta dalam komentar: Arti ?dalam TTYkolom output dari psdalam pertanyaan adalah bahwa wgetproses tidak lagi terkait dengan terminal / TTY. TTY hilang ketika koneksi SSH terputus.

Kusalananda
sumber
1
Saya pikir itu akan berguna jika Anda juga menambahkan arti? dalam tty.
yukashima huksay
Ya, pelajari ini dengan cara yang sulit. Tidak semua proses mati saat ssh turun. Adalah baik untuk tahu persis mengapa.
Doug
2
Bergantian, biasakan menggunakan layar dan tidak pernah ada HUP.
Harper - Pasang kembali Monica
8

Sederhana : wgettidak dibatalkan SIGHUP. Itu terjadi SIGTERMdan SIGINT.

Tidak ada apa-apa di manhalaman tetapi jika Anda mengirim SIGHUPke suatu wgetproses maka Anda mendapatkan ini di terminal:

# in a different terminal while wget is running (with PID 12345)
kill -HUP 12345
# in the wget terminal
SIGHUP received.
Redirecting output to 'wget-log'.
Hauke ​​Laging
sumber
1
Terima kasih. Saya pikir lebih baik jika Anda juga menambahkan kill -HUP pidperintah untuk menunjukkan bagaimana seseorang dapat mengirim SIGHUPke suatu proses.
yukashima huksay