While-loop'u ctrl + c / not / interrupt nasıl yapılır?


11

Bu döngü göz önüne alındığında:

while sleep 10s ; do
  something-that-runs-forever
done

Ctrl + C tuşlarına bastığımda tüm döngü döngüsü kesintiye uğrar. Yapmak istediğim "bir şey" -işlemini yarıda kesmek, 10 saniye geçmesine izin vermek ve daha sonra “bir şey” i yeniden başlatmak.

Ctrl + c'yi while döngüsünü değil, yalnızca "bir şeyi" nasıl etkilerim?

EDIT: "kesme" SIGINT gibi. Öldürmek. İptal. Sonlandırın. "Duraklat" daki gibi "kesme" değil.


Sadece duraklatmak istiyorsanız, neden Ctrl + Z'yi kullanmıyorsunuz, 10 saniye bekleyip koşuyorsunuz fg? Neden Ctrl + C kullanıyorsunuz?
terdon

@terdon: Yorum için teşekkürler, cevapla birlikte acele edebilirim.
OPs

@terdon: Duraklatmak istemiyorum. Yazdığım gibi 10 saniye geçmesini istiyorum.
bos

Dedin: What I want to do is to interrupt the "something"-process, let 10 seconds pass, and then restart "something". Ctrl + Z tuşlarına basarsanız, 10 saniye bekleyin ve sonra koşun fg, tam olarak ne olacak. Belki daha iyi anlayabilmemiz için sorunuzu düzenleyebilir ve belirli bir örnek verebilirsiniz?
terdon

3
Ctrl + C kesmesi bağlamında açık olduğunu düşündüm, ama açıkçası yanılmışım. Şimdi düzenledim.
bos

Yanıtlar:


18

Sadece bir trap SIGINTşeye çalışırsanız işe yarayacaktır . :( true) Gibi .

#!/bin/sh
trap ":" INT    
while sleep 10s ; do
    something-that-runs-forever
done

Antipatik something...o sinyali yok sayar, çünkü artık kabuk çıkış yapmaz. Ancak, sleepişlemi ^ C yaparsanız , bir hata ile çıkar ve döngü bu nedenle durur. sleepDöngünün içine taşıyın veya || truebunu önlemek için bir şey ekleyin .

Kullanmak eğer Not trap "" INT(yerine kendisine bir komut atama) tamamen sinyalini görmezden, o da yapamazsın kesme öyleyse, çocuk sürecinde göz ardı ediyor something...ya. Bu, en azından Bash'in el kitabında açıkça belirtilmiştir :

Eğer arg boş dize, o zaman her tarafından belirtilen sinyal sigspec kabuk ve onu çağıran komutlar tarafından göz ardı edilir. [...] Kabuğa girdikten sonra yok sayılan sinyaller yakalanamaz veya sıfırlanamaz.


Bu mevcut kabukta da gerçekleştirilebilir mi? (Bir senaryoda değil.)

1
do (trap - INT; something-that-runs-forever)Komutun kesilmesine izin vermek isteyebilirsiniz . Ayrıca, kaçak gerekmez :- sadece bir sinyal yok saymak için boş bir dize kullanabilirsiniz: trap '' INT. Bütün bunlar POSIX ve uyumlu bir kabuk üzerinde çalışmalıdır (sadece Bash üzerinde değil).
Toby Speight

Ayrıca, SIGINTtam olarak yazmanın kesinlikle taşınabilir olmadığını da unutmayın : " Uygulamalar, SIGönek içeren isimlere izin verebilir veya sinyal adlarında bir uzantı olarak durumu görmezden gelebilir . " (Vurgu)
Toby Speight

boş dizeyi bir sinyali görmezden gelme eylemi olarak iletebilirsiniz, örn. trap "" INT(ayrıca posix)
daf

@TobySpeight, trap :bunun yerine kullandığım nedenin trap ""tam olarak , sinyalin göz ardı edilmemesi (ancak bunun yerine no-op yapılması) idi, böylece ana somethingprogramı kesintiye uğratmak için başka bir şey yapmamız gerekmiyordu .
ilkkachu

0

Başka bir seçenek something-that-runs-foreverde sinyalin işlenmesidir (alındığında nazikçe çıkar). Tabii ki, sadece bu program birçok komut dosyasında kullanıldığında ve CTRL+ üzerinde istenen davranış Csistematik olarak aynı olduğunda - komut dosyası yürütmeye devam etmek için anlamlıdır .


ITYM "uyumak ve kendini yeniden yürütmek", "incelikle çıkış" değil mi?
Toby Speight
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.