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.kill
read
enter
Coreutils çözümleri [ 1 ]
Ne zaman coreutils sisteminizde mevcut ve harici bir program çağırmak için zaman ve kaynak tasarrufu hiç gerek yok, timeout
ve sleep
ve hedefe ulaşmak için her iki mükemmel yollarıdır.
timeout
Kullanımı timeout
basittir.
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 sleep
fantezini kullanabilirsin ya da biraz ilham alabilirsin [ 3 ] . Komutunuzu arka planda veya ön planda bırakabileceğinizi unutmayın (örneğin top
genellikle ö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,
YourCommand
ardından kabuğunuz sleep
5 dak. Bittiğinde son arka plan süreci ( $!
) öldürülecek. Kabuğunu durdur.
-
5. versiyonda bunun yerine arka planda çalıştırıyorsunuz
YourCommand
ve 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