Alt işlemdeki Ctrl + c, komut dosyasında daha önce nohup'ed bir işlemi öldürüyor


14

Bunun SO'ya ait olup olmadığını bilmiyordum (kodlama hatası olduğu için), ancak kullanılan yazılımın inceliklerini hakkında daha bilgili olacağınızı düşündüm (bu nedenle belki de U & L;

İşte minimal kod betiği (tam betiğin düzenlemelerine bakın, bu şekilde yapmamın bir nedeni var);

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

less +F currentOutput.log

Yapmaya çalıştığı şey, arka planda bir günlük dosyasına çıkan bir sunucuyu çalıştırmaktır.
Sonra ben follow o günlük dosyasını kullanarak less +F. Yaptığınız gibi, bundan çıkmak için vurmanız gerekir. ctrl + c vurmadan önce S .

Ne olur, ne zaman ben ctrl + c içinde less komut (durdurmak için tailing ) bir şekilde sunucuyu başlattığında öldürür nohup zirvede! Başka hiçbir şey etkilenmedi. yapabilirim vardiya + f günlüğü yeniden yazmaya başlamak için (sunucu öldürüldüğünden beri yeni bilgi gelmez) S betiğin geri kalanı normal şekilde çalışır.

Bunun neden olduğunu biliyor musun? Nasıl kullanmalıyım / kullanmam gereken başka bir şey?


Not;
Sunucu programı bir ^Csorun olabilir; Bunu durdurmak için yapabileceğim bir şey var mı? Mesela ben kaçtığımda {SERVERCOMMAND} kendi başına (engelleyici şekilde) vurabilirim ctrl + c , derhal onu öldürmez; yazdırır Received ^C signal, shutting down (ve sonra kendini öldürür). Bu ben olduğumda olan şey. ^C içinde less (Bir final Received ^C signal, shutting down günlüğe yazılır).


P.P.S
Birkaç şey denedim (hiçbiri işe yaramadı);

  • değiştirerek stdin komut dosyasını kesmeye çalışıyor

    nohup {SERVERCOMMAND} > currentOutput.log 2>&1 &
    to
    nohup echo '' | {SERVERCOMMAND} > currentOutput.log 2>&1 &
    or
    nohup cat /dev/null/ | {SERVERCOMMAND} > currentOutput.log 2>&1 &
    
  • kullanma stty intr ^G kesme komutunu değiştirmek için ctrl + g tam olarak ne yaptı ^C Zaten yapıyordum (yani bu benim terminal emülatörümle ilgili bir sorun olabilir; konsole )

  • yerleştirme nohup & amp; / veya less parantez içindeki satır (alt kabuk yapmak için)

  • betiği çalıştırmak xterm yerine konsole


Biri olabilir karşılaşmak benim sorunum; I think it is due to the handling within the database software, not on the shell. Bir program bunu nasıl yapar? O zaman nasıl durdurabilirim?
Hashbrown

3
nohup sürecin alınmasını önler SIGHUP CTRL + C gönderirken sinyal SIGINT sinyali. Bu yüzden nohup Beklediğin etkisi yok.
Piotr Dobrogost

Yanıtlar:


9

Öyle olduğunu düşünmekte haklıydım. SIGINT Tüm işlemlere ne zaman gönderileceğini ctrl + c , ama başka bir işlem yapmanın onu dışa çıkartacağını düşünerek aptaldım. process group (girişimlerime bakın P.P.S. ).

Bu sadece kesin kullanım örneği değil, doğru çözümdür.

Senaryomun nasıl yapılandırıldığına bağlı olarak cevap cevap vermedi.

#/bin/bash

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

Sunucu, benden sonra günlük dosyasına çıktı vermeye devam ediyor. ctrl + c içinde less.

Herkesin zamanı için teşekkürler.


0

Denedin mi sahip çıkmamak ?

  disown -h %1

ya da işin her neyse; sahip çıkmamak yerleşik bir kabuktur, man sayfa devletler:

sahip çıkmamak

[-ar] [-h] [iş yerleri ...]

Seçenekler olmadan, her iş alanı etkin iş tablosundan kaldırılır. Eğer -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 -ya da -r' option is supplied, the current job is used. If no jobspec is supplied, the -a 'seçeneği, tüm işleri kaldırmak veya işaretlemek anlamına gelir; jobspec argümanı olmayan `-r 'seçeneği çalışmakta olan işleri kısıtlar.

DÜZENLE

İşin komik yanı, yapımın benim Arch Linux'umda çalışıyor:

 $ 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]
  $

Önce ps komut, sonra out.log dosyasını kaydırmak zorunda kaldı Ctrl + C , sonra q .


evet, ama nasıl uygulanacağını bilmiyorum. Yerleştirmeyi denedim nohup bir fonksiyondaki satır disowns kendisi, ama bu aynı olmalı nohup. Bunun bir olduğunu sanmıyorum SIGHUP Sorun, kaldırdığımda olduğu gibi less satır, komut dosyası hala çalışmakta olan sunucuyla sona erer
Hashbrown

@Hashbrown pls düzenlememi görün
MariusMatutiae

Evet, ben de bir test yaptım, {SERVER} çalıştırılabilir yerine basit bir bash betiği çağrıldı. Ve nohup sadece iyi çalıştı. Soru hakkındaki yorumuma bakın. Bence bir şekilde bilerek dinliyor. Özelliği (ve iyi bilinmeyen) bir sunucu olduğundan, birisinin "oh X'i yapıyor, Y'yi yapmanız gerekir" diyebildiğini bile söyleyemem
Hashbrown
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.