Ctrl + c dalam sub proses membunuh proses nohup'ed sebelumnya dalam skrip

15

Saya tidak tahu apakah ini milik SO (karena itu adalah bug pengkodean) tetapi saya pikir kalian akan lebih berpengetahuan tentang seluk-beluk perangkat lunak yang digunakan (jadi mungkin bahkan U&L dapat dipertimbangkan).

Inilah skrip kode minimal (lihat suntingan untuk skrip lengkap, ada alasan saya melakukannya dengan cara ini);

#/bin/bash
nohup {SERVERCOMMAND} > currentOutput.log 2>&1 &

less +F currentOutput.log

Yang coba dilakukan adalah menjalankan server di latar belakang, yang menghasilkan file log.
Lalu saya followmenggunakan file log itu less +F. Saat Anda melakukannya, untuk keluar ini Anda harus menekan ctrl+ csebelum Anda bisa menekan Q.

Apa yang terjadi adalah, ketika saya ctrl+ cdi dalam lessperintah (untuk menghentikan tailing) itu entah bagaimana membunuh server dimulai dengan nohupdi atas! Tidak ada yang terpengaruh. Saya dapat shift+ funtuk memulai tailing log lagi (yang tidak mendapat info baru karena server terbunuh) dan jika saya menekan Qsisa skrip dijalankan secara normal.

Tahukah Anda mengapa ini terjadi? Bagaimana cara menghindarinya / hal lain yang harus saya gunakan?


PS
Program server mungkin mendengarkan ^C, yang mungkin menjadi masalah; adakah yang bisa saya lakukan untuk menghentikannya? Seperti, ketika saya hanya menjalankannya {SERVERCOMMAND}sendiri (dengan cara memblokir), saya dapat menekan ctrl+ c, yang tidak langsung membunuhnya; itu mencetak Received ^C signal, shutting down(dan kemudian membunuh dirinya sendiri). Inilah yang terjadi ketika saya ^Cmasuk less(Final Received ^C signal, shutting downditulis ke log).


PPS
Saya sudah mencoba beberapa hal (tidak ada yang berhasil);

  • mencoba memutus stdin dari skrip dengan mengubah

    nohup {SERVERCOMMAND} > currentOutput.log 2>&1 &
    to
    nohup echo '' | {SERVERCOMMAND} > currentOutput.log 2>&1 &
    or
    nohup cat /dev/null/ | {SERVERCOMMAND} > currentOutput.log 2>&1 &
  • gunakan stty intr ^Guntuk mengganti perintah interrupt, tetapi kemudian ctrl+ tetap gmelakukan apa yang ^Csedang dilakukan (jadi ini mungkin merupakan masalah dengan emulator terminal saya; konsole)

  • menempatkan nohup& / atau lessgaris dalam tanda kurung (untuk membuatnya menjadi subkulit)

  • menjalankan skrip xtermalih-alihkonsole

Hashbrown
sumber
Seseorang mungkin telah menemukan masalah saya; I think it is due to the handling within the database software, not on the shell. Bagaimana program melakukan ini? Lalu bagaimana saya bisa menghentikannya?
Hashbrown
3
nohupmencegah proses menerima SIGHUPsinyal sedangkan CTRL + C mengirim SIGINTsinyal. Itu sebabnya nohuptidak memiliki efek yang Anda harapkan.
Piotr Dobrogost

Jawaban:

11

Saya benar dalam berpikir bahwa itu SIGINTdikirim ke semua proses ketika ctrl+ c, tetapi saya konyol dalam berpikir bahwa membuat proses lain akan membawanya keluar process group(lihat upaya saya di P.P.S.).

Ini , tidak hanya kasus penggunaan yang tepat, tetapi solusi yang benar.

Karena bagaimana skrip saya disusun, jawaban di sana tidak cocok dengan kata demi kata, inilah skripnya sekarang;

#/bin/bash

setsid {SERVERCOMMAND} > currentOutput.log 2>&1 &
less +F currentOutput.log

Server terus output ke file log setelah saya ctrl+ cdi less.

Terima kasih atas waktu semua orang.

Hashbrown
sumber
0

Sudahkah Anda mencoba mengingkari ?

  disown -h %1

atau apa pun pekerjaan Anda; disown adalah built-in shell, halaman manualnya menyatakan:

memungkiri

menolak [-ar] [-h] [jobspec ...]

Tanpa opsi, setiap jobspec dihapus dari tabel pekerjaan aktif. Jika opsi -h' option is given, the job is not removed from the table, but is marked so that SIGHUP is not sent to the job if the shell receives a SIGHUP. If jobspec is not present, and neither the-a 'nor -r' option is supplied, the current job is used. If no jobspec is supplied, the-a' berarti menghapus atau menandai semua pekerjaan; opsi `-r 'tanpa argumen jobspec membatasi operasi untuk menjalankan pekerjaan.

EDIT

Lucunya, konstruksi Anda berfungsi di Arch Linux saya:

 $ cat testm
  #!/bin/sh

  nohup /home/mario/temp/waste & 

  less +F out.log

 $ cat waste
  #!/bin/sh

  while [ 1 ]; do
    find / -print 2>1 1> out.log
  done
  $ ./testm
   nohup: appending output to nohup.out
  $ ps ax | grep waste
    19090 pts/2    S      0:00 /bin/sh /home/mario/temp/waste
    19124 pts/2    S+     0:00 grep waste]
  $

Sebelum perintah ps , saya harus menggulir file out.log, lalu Ctrl+C, lalu q.

MariusMatutiae
sumber
ya, tapi saya tidak tahu bagaimana cara menerapkannya. Saya mencoba menempatkan nohupgaris dalam fungsi yang disownsitu sendiri, tetapi itu harus sama dengan nohup. Saya tidak berpikir ini SIGHUPmasalah, karena ketika saya menghapus lessbaris, skrip diakhiri dengan server masih berjalan
Hashbrown
@Hbbrown tolong lihat hasil edit saya
MariusMatutiae
Ya saya melakukan tes juga, dengan skrip bash sederhana dipanggil bukannya dieksekusi {SERVER}. Dan nohup bekerja dengan baik. Lihat komentar saya pada pertanyaan. Saya pikir itu sengaja mendengarkan entah bagaimana. Karena ini adalah server kepatutan (dan tidak terkenal), saya bahkan tidak bisa mengatakan apa itu sehingga seseorang dapat pergi "oh itu melakukan X, Anda perlu melakukan Y"
Hashbrown