Gecikmeli bir komut arka planda nasıl çalıştırılır?


33

Biri bana bu işlemi yapmak için nasıl bir program yapabileceğimi gösterebilir mi: 5 dakika sonra

echo "80" > /sys/class/leds/blue/brightness

Bu programın arka planda çalışmasını istiyorum ( rngdhizmet gibi ) Bunu yapamam çünkü Linux hakkında fazla bir şey bilmiyorum.

Yanıtlar:


51
( 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 sleepya echoda 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/noautostartana uygulama başlamaz. Bekçi köpeği devreye girerse, rm /tmp/startdelayyapı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.


Evet katılıyorum, ancak bu kullanıcı yansımasının bir parçası da olabilir ;-)
Kiwy

Diğer cevaplar "arka planda" kısmını da özlüyor. Hayır, bu konuda oldukça açıktı: /
goldilocks

@goldilocks: Gönderimi arka plan kısmına sadece cevabımı gönderdikten sonra eklediniz.
SF.

Hayır, orijinal cevabım uykuyu &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
goldilocks 28:13

1
@gekannt: ... ah, soru " Arka planda gecikmeli bir komut nasıl çalıştırılır ?" - başka türlü nasıl başardınız? (ve hayır, ()grubu arka planlamasanız, orijinal kabuk ortaya çıkana kadar durur.)
SF.

11

kullanmak atkomutunu

echo "echo \"80\" > /sys/class/leds/blue/brightness" | at now + 5 min

arka planda çalışacak


2
Bunu yapmak için doğru yol budur, ancak çalışan atd arka plan programına ihtiyacı vardır ve çoğu sistemde bir paketin yüklü olması gerekir.
Julian

echoKaçış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.
Chris Down,

@Julian, atstandart bir POSIX komutudur. Hangi Unix benzeri sistem varsayılan olarak kullanılabilir durumda değildir?
Stéphane Chazelas

1
@ StéphaneChazelas - iyi bir soru. Biliyorum bu problemim oldu ama bir süre önceydi. Küçük bir kontrol yaptım ve komut at oldukça yaygın görünüyor. Ayrıca Linux'un kendine özgü olduğu ve hatta bazı Linux sistemlerinde bile BSD tarzı bir cron artalanının yerini alabileceği görülüyor. Benim yorumumun modası geçmiş olduğunu düşünelim.
Julian

'At' denedim ve Android 8'de hiçbir komut bulunamadı
beppe9000

6

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 hellove 3 saniye sonra (ana programdan çıktıktan sonra) yazdıracak world.

Önemli olan &, işlev yürütmesini arka plana çatallamaktır.


1
runWithDelay () { sleep $1; "${@:2}"; }Bunun yerine önerebilir miyim ?
Manat işi

1
Sanırım doWhateverWithDelay 3 &ikinci örneğinde okumalısın .
Baarn

@ yönetimsel: Şerefe.
goldilocks

1
@goldilocks, kullanımda esastır $@ki alıntı yapabilirsiniz ve alıntı kelimelerin listesi olarak genişletilecektir. Öyleyse daha iyi yap "$@"(ya "${@}"da telleri seviyorsan). Bkz pastebin.com/MU7hbB2C
manatwork

@ manatwork: Alınan nokta;) Bunları echo ( -n) args kullanarak denedim , ama açıkçası bu biraz saftı.
goldilocks
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.