Yanıtlar:
( sleep 300 ; echo "80" > /sys/class/leds/blue/brightness ) &
Bu şekilde, komut dosyanız devam eder veya komutun yeni bir arka plan görevi başlarken, iki komutla derhal denetimi geri yüklersiniz : sleep ve echo.
Yaygın hata, amaçlanan şekilde çalışmayan birini sleep
ya echo
da ikisini birden vermeye çalışıyor &
. ()
Yine de bir dizi komutu başlatmak, onları ayrı bir kabuk işleminde ortaya çıkarır &
;
Aktif olarak yararlı bulduğum o zekâya. Geliştirdiğim gömülü bir cihazda, bir bekçi köpeğiyle çalışan ana uygulama var. Başlatmadan hemen sonra bekçi uygulaması sıfırlamasını tetikleyecek bir şekilde başarısız olursa, işletim sistemi başlangıcı ile sıfırlama arasındaki süre oldukça kısa olduğundan, uygulamanın başlatılması ve engellenmesi için yeterli olmadığı için uzaktan düzeltmek zordur. Bu yüzden sistemin çok hızlı bir şekilde yeniden başlatıldığını belirlemek ve kendime manuel olarak düzeltmek için zaman tanımak için bir gecikme sağlamak için bir yola ihtiyacım var.
[ -f /tmp/startdelay ] && sleep 30
touch /tmp/startdelay
( sleep 30 ; rm /tmp/startdelay ) &
[ -f /tmp/noautostart ] && exit 0
start_app
Giriş yaparsam ve uygularsam touch /tmp/noautostart
ana uygulama başlamaz. Bekçi köpeği devreye girerse, rm /tmp/startdelay
yapılmayacaksa ve sistem bir dahaki sefer başlatıldığında, durdurmam için bana ekstra 30 saniye verecek. Aksi takdirde, yeniden başlatma gecikmeden hızlı olacaktır.
&
arka planlamak için uyku içeren bir işlev çalıştırmaktı ; "Uykuyu da arka planlamanız gerekiyor" başından beri ilk satırdaydı. Bana inanmıyorsanız, düzenleme geçmişine bakın. Ve cevabım sizinkinden 5 dakika daha eski: P
()
grubu arka planlamasanız, orijinal kabuk ortaya çıkana kadar durur.)
kullanmak at
komutunu
echo "echo \"80\" > /sys/class/leds/blue/brightness" | at now + 5 min
arka planda çalışacak
echo
Kaçıştan kaçınmak için tek tırnaklar kullanabilirsiniz ve bir sapkınlık veya saptırma aracı kullanarak bir bütün olarak belirtmelisiniz.
at
standart bir POSIX komutudur. Hangi Unix benzeri sistem varsayılan olarak kullanılabilir durumda değildir?
Bir şeyin 5 dakika içinde çalışması ancak programınızın geri kalanının devam etmesi (veya bitmesi) istiyorsanız, uykuyu da arka planlamanız gerekir:
#!/bin/bash
runWithDelay () {
sleep $1;
shift;
"${@}";
}
runWithDelay 3 echo world &
echo hello
Bu yazdıracak hello
ve 3 saniye sonra (ana programdan çıktıktan sonra) yazdıracak world
.
Önemli olan &
, işlev yürütmesini arka plana çatallamaktır.
runWithDelay () { sleep $1; "${@:2}"; }
Bunun yerine önerebilir miyim ?
doWhateverWithDelay 3 &
ikinci örneğinde okumalısın .
$@
ki alıntı yapabilirsiniz ve alıntı kelimelerin listesi olarak genişletilecektir. Öyleyse daha iyi yap "$@"
(ya "${@}"
da telleri seviyorsan). Bkz pastebin.com/MU7hbB2C
-n
) args kullanarak denedim , ama açıkçası bu biraz saftı.