Coreutilsbash olmadan saf yerleşik
Bu çözümün harici bir yürütülebilir dosyayı çağırmadan yerleşikbash bir komuta güvenerek çalıştığını gördüm . Sonunda coreutils bile kurulmamış olan sistemde çalışır [ 1 ]
YourCommand & read -t 300 ; kill $! # 1st version
YourCommand & read -t 300 || kill $! # 2nd version
Açıklamalar : zamanki gibi arka planda bir komut gönderirken &kendi PID iç değişken içine saklanır, $!(modern versiyonunda mevcut dash, csh, bash, tcsh, zsh...).
Kabuklar arasındaki farkı gerçekten yapan şey, yerleşik komutun read[ 2 ] ve seçeneğin varlığıdır -t. 1. versiyonda, kullanıcı belirtilen saniye miktarından önce bir girdi satırını tamamlamazsa, talimat sonlandırılacak ve bir hata dönüş kodu üretilecektir.
-t TIMEOUT TIMEOUT saniye içinde tam bir giriş satırı okunmazsa zaman aşımı ve geri dönüş hatası için okumaya neden olun.
İkinci versiyon 1 olarak çalışır, ancak sadece basarak öldürme zaman aşımını iptal edebilirsiniz enter.
Aslında, veya operatörü ifadeyi yalnızca komut, zamanaşımı süresi dolduğunda olduğu gibi sıfırdan farklı bir dönüş koduyla çıkarsa ||çalıştırır . O andan önce basarsanız , 0 değerini döndürür ve önceki komutunuzu öldürmez.killreadenter
Coreutils çözümleri [ 1 ]
Ne zaman coreutils sisteminizde mevcut ve harici bir program çağırmak için zaman ve kaynak tasarrufu hiç gerek yok, timeoutve sleepve hedefe ulaşmak için her iki mükemmel yollarıdır.
timeoutKullanımı timeoutbasittir.
Sonunda -k, ilk başarısız olursa ek bir öldürme sinyali gönderme seçeneğini kullanmayı düşünebilirsiniz .
timeout 5m YourCommand # 3rd version
sleep
Seninle sleepfantezini kullanabilirsin ya da biraz ilham alabilirsin [ 3 ] . Komutunuzu arka planda veya ön planda bırakabileceğinizi unutmayın (örneğin topgenellikle ön planda olması gerekir).
YourCommand & sleep 5m; kill $! # 4th Background
YourCommand & pid=$! ; (sleep 5m; kill $pid;) & # 5th Background
bash -c '(sleep 5m; kill $$) & exec YourCommand' # 6th Foreground
(cmdpid=$BASHPID; (sleep 5m; kill $cmdpid) & exec YourCommand) # 7th Foreground
açıklamalar
- Dördüncü versiyonda arka planda çalıştırıyorsunuz,
YourCommandardından kabuğunuz sleep5 dak. Bittiğinde son arka plan süreci ( $!) öldürülecek. Kabuğunu durdur.
-
5. versiyonda bunun yerine arka planda çalıştırıyorsunuz
YourCommandve hemen bu PID'yi değişkende saklıyorsunuz $pid. Ardından, arka planda 5 dakikalık bir kestirmeden sonra saklanan PID'i öldürecek komutunu uygularsınız. Bu komut grubunu arka planda gönderdiğiniz için, kabuğunuzu durdurmazsınız. PID'i bir değişkende saklamanız gerekir, çünkü değeri $!arka planda başka bir programın sonunda çalıştırılmasıyla güncellenebilir. Basit bir deyişle , yanlış işlemi ya da hiç işlem yapmama riskini önlersiniz .
- 6. versiyonda 5 dakika içinde intihar edecek olan yeni bir bash kabuğu denir
$$, sonra ön planda kalan emrinizi yerine getirir.
- 7. versiyonda , PID'sini
()bir değişkende ( cmdpid) saklayan ve arka plan yürütme sırasında gönderilen başka bir alt kabuk ile kendisini öldüren bir alt kabuk çağrılır, ardından YourCommand'ı ön planda çalıştırır.
Elbette her versiyonda , sadece gerçekten ihtiyaç duyulduğunda kullanılmak üzere varsayılandan aşırıya kadar ihtiyacınız olan öldürme sinyalini gönderebilirsiniz kill -9.
Referanslar
- [ 1 ] Coreutils
- [ 2 ] Bash Yeni Başlayanlar Rehberi
- [ 3 ] BashFAQ