Görevi sessizce arka planda başlat


12

İşlem arka planda konulduğunda ve böyle yapıldığında bildirim almadan arka planda bir işlem başlatmak için bunu kullanabileceğinizi biliyorum:

(komut &) &> / dev / null

Ancak bu işlem bittiğinde bindirme seçeneğini kaldırır ( trap child_done CHLD).

Her ikisine nasıl sahip olabilirim?

Yanıtlar:


5

görev biriktirici size yardımcı olabilir.

Olduğu gibi freshmeat.net :

görev biriktiricisi, biriktirilen görevlerin peş peşe çalıştığı bir Unix toplu iş sistemidir. Bir seferde çalıştırılacak iş miktarı her zaman ayarlanabilir. Her sistemdeki her kullanıcının kendi iş kuyruğu vardır. Görevler herhangi bir kabuktan / işlemden doğru bağlamda (enqueue) çalıştırılır ve çıktısı / sonuçları kolayca izlenebilir. Komutlarınızın çok fazla RAM'e, çok fazla disk kullanımına, çok fazla çıktı vermesine veya her ne sebeple olursa olsun aynı anda çalıştırmamanız daha iyi olur. maksimum fayda sağlamak için kaynaklarınız meşgul. Arayüzü komut dosyalarında kolayca kullanılmasına izin verir.

Görev biriktirici Debian , Ubuntu ve diğer dağıtımlarda mevcuttur.

Çalıştırmak için bir sıraya sahip olmanıza ve çıktılarına yalnızca istek üzerine erişmenize olanak tanır.

Örneğin:

$ tsp sleep 5
0 
$ tsp sleep 5 
1
$ tsp
ID   State      Output               E-Level  Times(r/u/s)   Command [run=1/1]
2    running    /tmp/ts-out.ZWn6Le                           sleep 5
1    finished   /tmp/ts-out.Fhlcle   0        5.00/0.00/0.01 sleep 5

Arka planda çok fazla iş yaparsanız, kesinlikle size yardımcı olacaktır.

Bunları sırayla veya önceden belirlenmiş miktarda yuvada çalıştırabilirsiniz. (Çalıştırmak Ayrıca görevleri arasında bağımlılıkları kurabilir Task1 yalnızca task0 başarıyla tamamlandı).


3

Her ikisinde de bunu nasıl yapacağınız aşağıda açıklanmıştır {ba,z}sh.

Bir işlevi kullanmak, zsh' monitordeğişkenini ' durumunu kullanarak kaydetmeye ve geri yüklemeye gerek kalmamasına yardımcı olur setopt local_options.

# Run the command given by "$@" in the background
silent_background() {
  if [[ -n $ZSH_VERSION ]]; then  # zsh:  https://superuser.com/a/1285272/365890
    setopt local_options no_notify no_monitor
    "$@" &
  elif [[ -n $BASH_VERSION ]]; then  # bash: https://stackoverflow.com/a/27340076/5353461
    { 2>&3 "$@"& } 3>&2 2>/dev/null
  else  # Unknownness - just background it
    "$@" &
  fi
}

Bunu aşağıdaki gibi kullanarak:

trap 'echo child done' CHLD
silent_background sleep 1

Beklenen child donemesajı üretecektir .


umutlu bir açıklama için unix.stackexchange.com/q/456549/4778 adresine bakın .
ctrl-alt-delor

2

Komut çıkışının yeniden yönlendirilmesi, bir zaman uyumsuz olarak başlatıldığında bildirim kabuk tarafından gönderildiği için önemsiz görünüyor . Daha doğrusu, iş kontrolü ile ilgili bir kabuk özelliğidir (fonctionality) .

Burada, "Bash Referans Kılavuzu", "İş Kontrolü" bölümü, birinci bölümden gelen bir alıntı.

Kabuk, bir JOB'u her bir boru hattı ile ilişkilendirir. Şu anda yürütülen işleri jobskomutla birlikte listeleyen bir tablo tutar . Bash bir işi eşzamansız olarak başlattığında, şuna benzer bir çizgi yazdırır:

[1] 25647

bu işin 1 numaralı iş olduğunu ve bu işle ilişkili ardışık düzendeki son işlemin işlem kimliğinin 25647 olduğunu gösterir. Tek bir ardışık düzendeki tüm işlemler aynı işin üyeleridir. Bash, iş kontrolünün temeli olarak JOB soyutlamasını kullanır.

Kabuk betiğinin bu bildirimi görüntülemediğini unutmayın.

$ cat test
#!/bin/bash

true & echo true
$ ./test
true

Aslında

zsh

Zsh belgeleri bu bildirimler hakkında benzer endikasyonlar sağlar, bkz man 1 zshmisc. Bölüm "İŞ". Zaman Bu bildirimler gösterilmez iş kontrolü devre dışı bırakılır.

MONİTÖR ( -m , ksh: -m )

    İş kontrolüne izin ver. Etkileşimli kabukta varsayılan olarak ayarlanır.

zsh_prompt % setopt no_monitor
zsh_prompt % true & echo true
true
zsh_prompt %
zsh_prompt % 

darbe

Görünüşe göre Bash her zaman görüntüler [1] 25647. "Son bildirim" örn. [1]+ Done true, İş kontrolü devre dışı bırakıldığında görüntülenmez.

bash_prompt $ true & echo true
[1] 25647
true
bash_prompt $ 
[1]+  Done                    true

İş kontrolü devre dışı

bash_prompt $ set +m       # disable job control
bash_prompt $ true & echo true
[1] 25685
bash_prompt $
bash_prompt $

Sonuç

Bildirimleri gizlemek için iş kontrolünü devre dışı bırakmanın iyi bir şey olup olmadığını bilmiyorum ?

kaynaklar


1

zshİş bildirimlerini devre dışı bırakmak için etkileşimli olmayan bir kabuk olarak çağırabilirsiniz .

zsh -c '
   trap "echo trapped child_done" CHLD
   sleep 5 &
   #wait
   sleep 10 # simulate other running cmds
   echo script done
'

0

Aşağıdaki örneğe bakın:

trap 'echo "DONE"' 0
{ find /usr & } &> /dev/null
wait

İyi çalışıyor. Gerek yok ( ): bu gerekli olmayan bir alt kabuk yapar. { }sadece gruplama komutlarıdır.


Bu baskı [2] 49591ve [2] + 49591 exit 1 find /usrne zaman ne basması gerektiğini!
Tyilo

Üzgünüm, sorunuzu yanlış anladınız.
Gilles Quenot

0

Bu eski bir sorudur, ancak olası bir cevap (bash'de, zsh ile test edilmemiştir) iş kontrolünü alt kabukta kullanmaktır: (command & wait)

Not: bash, alt kabuktaki başlangıç ​​/ bitiş arka plan iş iletilerini bastırır ve yeniden yönlendirmeye gerek yoktur.


Sanırım tuzağın bir kısmını kaçırdınız. Alt işlemin başlaması gereken soruyu anladığım kadarıyla, süreç tamamlanırken ve sonra alt işlem bittiğinde başka bir şey yürütülmelidir. Çözümünüzle, alt işlemde alt kabukta bekleyin ve ana kabuk alt kabuk için bekler. Bu mesajlardan kurtulur, ancak paralel bir şey yapamazsınız.
Raphael Ahrens

Hayır, (sleep 5 & wait)5 saniye geciktirir.
Tom Hale
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.