Kuyruktaki gibi komutlar nasıl çalıştırılır


42

Çok çeşitli dosyaları çeşitli klasörlere kopyalamam gerekiyor. Tüm copy komutlarımı bir bash betiğine ekleyebilir ve sonra çalıştırabilirim, ancak bu kopya "kuyruğuna" kopyalamak için daha fazla komut eklemek istersem bitinceye kadar beklemeliyim.

Komutları bir sıra olarak çalıştırabilmemin ve işler sırasında bu kuyruğa daha fazla komut ekleyebilmemin bir yolu var mı?

Farklı bir şekilde anlatılan, uzun süren bir işe başlamak istiyorum. Bu çalışırken, birincisi bitene kadar başlamayan bir tane daha başlatmak istiyorum. Ve sonra sonuncusundan sonra başka bir tane daha ekle. Bu bir şekilde mümkün mü?


3
Sorunu çözen bir cevabı kabul etmeni önerebilir miyim? Görünüşe göre senin için işe yarayacak bir çift var.
Holmb

2
Evet yapabilirsin ve ben de istedim. Sorun şu ki, Mac kullanan bir şirkette çalışırken bunu sordum. Artık orada çalışmıyorum ya da kendim de herhangi bir Mac'im yok, bu yüzden bunların hiçbirini test edemiyorum. Gerçekten işe yaradığını test edemediğimde, bir cevap olarak işaretleme konusunda rahat hissetmeyin, bu yüzden şu anda insanların kendileri için iyi iş buldukları bu cevapları oylamasını ve böylece “cevap” ın bu şekilde ortaya çıkmasını umuyorum. yerine.
Svish

Yanıtlar:


25

atEn iyi Belirlenmiş bir zamanda komutları çalıştırmak için bilinen yarar, aynı zamanda bir kuyruk özelliği vardır ve şu anda yayınlanmakta komutları başlatmak için istenebilir. Standart girişten çalıştırma komutunu okur.

echo 'command1 --option arg1 arg2' | at -q myqueue now
echo 'command2 ...' | at -q myqueue now

batchKomut eşdeğerdir at -q b -m now( -mcron yaptığı gibi, eğer varsa, size postalanacaktır, komut çıkışını anlamında). Tüm unix değişkenlerinin sıra adları ( -q myqueue) desteklenmiyor ; adı verilen tek bir sıra ile sınırlı olabilirsiniz b. Linux at, tek harfli sıra adları ile sınırlıdır.


2
Linux'ta en azından bu, önceki komutun bitmesini beklemiyor gibi görünüyor.
saat

@wds Debian wheezy'de benim için çalışıyor. Senin için nerede ve nasıl bozuldu? Sadece komutun bitmesini beklediğine dikkat edin; komut, üst öğelerini aşan alt işlemleri başlatıyorsa, alt işlemler için beklemeyin.
Gilles 'SO- kötülük yapmayı bırak'

CentOS 6'yı denedim. Sadece basit bir "uyku x" ile test ettim. Bunu çalıştırmak için ne yapılması gerektiğinden emin değilim ama bir alt kabuk başlattığını ve bu alt kabuğun sonucu beklemesi gerektiğini düşünüyorum (bir uyku çağrısı hemen geri dönmez).
saat

Sıra isimlerinin yanı sıra, 'şimdi' de standart görünmüyor:
ubuntu'daki

Ah @winwaed, bu kadar nowdeğil -t now, üzgünüm. Örnek kodda yanlış yaptığımı farketmemiştim.
Gilles 'SO- kötülük yapmayı bırak'

23

&Komutunuzun sonuna ekleyerek arka plana gönderin ve ardından bir waitsonraki çalıştırmadan önce üzerine ekleyin . Örneğin:

$ command1 &
$ wait; command2 &
$ wait; command3 &
$ ...

2
yuppi! Bu sözdizimi, bir şeye tekme atıp sonra bir şeyler sıraya koymak için stackoverflow'a bakmaya başladığınızda
harikadır

2
Bu arada herhangi bir komutla ilgili fikrinizi değiştirirseniz, iptal etmek için ne yapılabilir wait? Bütün ölümlerime karşı geçirimsiz görünüyor.
Ken Williams,

1
Sen sadece emri öldür. Birincisi waitbitene kadar basitçe işi durdurur.
Gert Sønderby

Bu işe yarayacak nohupmı?
Michael,

11

Hem Brad hem de Mankoff'un çözümleri iyi önerilerdir. Her ikisinin bir kombinasyonuna benzer olan bir başka, sıranızı uygulamak için GNU Ekranı kullanmak olacaktır . Bu, arka planda çalışabilme avantajına sahiptir, ne zaman isterseniz kontrol edebilirsiniz ve yeni komutları sıraya koymanız, önceki komutlar çıktıktan sonra çalıştırılacak tamponun içine yapıştırır.

İlk önce koşun:

$ screen -d -m -S queue

(bu arada, şimdi bazı harika. screenrc dosyaları ile oynamak için iyi bir zaman )

Bu, sıradaki sizin için bir arka plan ekranı oturumu açacaktır.

Şimdi istediğiniz kadar komut sıralayın:

screen -S queue -X stuff "echo first; sleep 4; echo second^M"

Sadece test için yukarıdaki çoklu komutları yapıyorum. Kullanım durumun muhtemelen daha çok benzeyebilir:

screen -S queue -X stuff "echo first^M"
screen -S queue -X stuff "echo second^M"

Yukarıdaki satırdaki "^ M" nin, ekranın mevcut bash kabuğuna doldurmasından sonra yorumlanacak gömülü bir yeni satır almanın bir yolu olduğunu unutmayın. Bu sırayı almak için "CTL-V" kullanın.

Bunu basitleştirmek ve komutları sıralamak için bazı basit kabuk komut dosyaları hazırlamak oldukça kolay olurdu. Ardından, arka plan sıranızın durumunu kontrol etmek istediğinizde, aşağıdakileri kullanarak yeniden eklersiniz:

screen -S queue -r

Teknik olarak, ekran oturumunuzu adlandırmanız bile gerekmez ve iyi çalışır, ancak bir kez bağlandığınızda, bir tanesini her zaman çalışır halde bırakmak isteyeceksiniz. ;-)

Tabii ki, bunu yaparsanız, bunu yapmanın başka bir iyi yolu mevcut pencerelerden birini "sıraya" isimlendirmek ve kullanmaktır:

screen -S queue -p queue -X stuff "command"

Temelde sadece çalışan ekran oturumunda komutu "yazıyor" gibi gözüküyor, böylece ilk komut bittikten sonra kabuk tekrar kontrol kazandığında, bu komut başlayacaktır. Başka bir deyişle, @ mankoff'un çözümüne eşdeğerdir, ancak yazmayı yapmak için bir meraklısı aracı kullanır.
Ken Williams,

Hemen hemen - temel fark, ekran çözümünün daha iyi otomasyonu desteklemesidir. Bazı şeyleri elle, komut dosyası içeren diğer şeyleri basit bir arayüzle yapabilirsiniz.
Jordan

@Jordan Çok iyi, benim için çalışıyor. Ama -X sonrası için "malzeme" nedir?
Konstantin

@Konstantin gnu.org/software/screen/manual/html_node/Paste.html#Paste (TL; DR - yazdığınız gibi terminale ne izlerse )
Ürdün

@Jordan Oh, şimdi görüyorum. Bu bir emirdir. Keyfi bir dize olduğunu düşündüm.
Konstantin,

8

Tarif ettiğiniz kullanım senaryosunda büyük bir başarı ile kullandığım bir yardımcı program var. Son zamanlarda birincil dizüstü bilgisayarımı yeni bir donanıma taşıdım, bu da bazı dosyaları bir NAS'a, diğerlerini de yeni makineye taşıyordu.

Ben böyle yaptım.

  1. Ağ bağlantısına sahip tüm makineleri birbirlerine erişebilecekleri şekilde ayarlayın.

  2. Dosyaları taşıdığınız makinede (bundan sonra kaynak makine olarak adlandırılır) rsync'i apt-get install rsyncve gizli sos Görev Biriktiricisi'ni (web sitesi http://vicerveza.homeunix.net/~viric/soft/ts/ ) yükleyin . Eğer Debian üzerinde paket adı varsa için tsolduğunu task-spoolerve yürütülebilir yeniden adlandırılır tspile önlemek adı çatışmaya tsyürütülebilir moreutilspaketin. Web sitesinden bağlanan Debian paketi Ubuntu ile mükemmel bir şekilde kurulabilir dpkg -i task-spooler_0.7.3-1_amd64.deb.

  3. Ayrıca tüm makinelerin SSH takılı olduğundan emin olun apt-get install openssh-server. Kaynak makinede, hedef makinelerde şifresiz oturum açmaya izin vermek için SSH kurmanız gerekir. En çok kullanacağımız yöntem, genel anahtar kimlik doğrulamasıdır ssh-agent( bunun örnekleri için bkz. Https://www.google.se/search?q=ssh+public+key+authentication ), ancak bazen sadece çalışan daha kolay bir yöntem kullanıyorum yanı sıra şifre doğrulama ile. Aşağıdakileri SSH istemcisi yapılandırmanıza ekleyin (ya ~/.ssh/configda /etc/ssh/ssh_config):

    Host *
         ControlMaster auto
         ControlPath ~/.ssh/master-%r@%h:%p
    

    Ardından kaynak makinedeki bir terminali açın, giriş yapın ssh target1, normal şekilde doğrulayın ve sonra bu terminali açık bırakın. Adında bir soket dosyası olduğuna dikkat edin ~/.ssh/master-user@target1:22, bu kimliği doğrulanmış bir ana oturumu açık tutacak ve daha sonra şifresiz bağlantılara izin verecek dosyadır user(bağlantı aynı hedef ana bilgisayar adını ve bağlantı noktasını kullandığı sürece).

    Bu noktada, hedef makinelerde kimlik doğrulaması istenmeden giriş yapabileceğinizi doğrulamanız gerekir.

  4. Şimdi ts rsync -ave ssh bigfile user@target1:tek bir dosya veya ts rsync -ave ssh bigdir user@target1:bir dizin için çalıştırın . Rsync ile, dizine ( bigdirbununla kıyaslandığında bigdir/) takip eden bir eğik çizgi eklememek önemlidir, yoksa rsync, bigdir/*diğer araçların çoğunun eşdeğeri anlamına geldiğini varsayacaktır .

    Görev Biriktiricisi istemi döndürür ve bu komutların çoğunu art arda sıraya sokmanıza izin verir. Çalışma kuyruğunu tsbağımsız değişkenlerle inceleyin.

Görev Biriktiricisi, çalışma sırasını yeniden düzenleme, yalnızca başka bir iş başarılı bir şekilde çalıştıysa belirli bir işi yürütme, vb. Gibi birçok özelliğe sahiptir ts -h. Yardımı görüntüleyin . Bazen çalışırken komut çıktısını denetlerim ts -c.

Bunu yapmanın başka yöntemleri de var ama kullanımınız için hepsi Görev Biriktiricisi içeriyor. SMB üzerinden kopyalamanın yapamayacağı dosya zaman damgalarını korumak için SSH üzerinden rsync kullanmayı tercih ediyorum.


Cevabınız için teşekkür ederim, ben tssadece github autotoolized ve debianized için çatal, kullanımı çok güçlü ve kullanımı kolay görünüyordu .
Alex

@Alex Çatalınıza bir göz attım ve özellikle orijinal kaynağı otomatik olarak tonik hale getirmek ve debianize etmekle ilgili olarak özellikle ilgimi çekti ve taahhütlerinize bakıldığında orijinal kaynağa bir fark olarak kolayca ulaşılamadı. 1. adımda orijinal kaynağı ithal eden ve 2. ilavelerinizi yapan yeni taahhütler vermeye zorlar mısınız? Kaynağınızı tarayan birisinin orijinal kaynağa eklemelerinize (daha kolay) güvenmesine yardımcı olur. Bu, bir PPA veya benzerinden kurmadığım birkaç paketten biri, bu yüzden çatalı kendim kurmak güzel olurdu.
14'te

gözlüklerimi değiştirdiğimi biliyorsun, cevabınızın var olan task-spooler:-) hakkındaki cevabınızın bir kısmını kaybettim zaten ... ... yorumunuzda bu çok iyi bir öneri, çok yakında yapacağım.
Alex

bitti, silindi ve tekrarlayan komisyonlarla depoyu yeniden yarattı, sadece birkaç hata (itilmeden önce daha fazla yerel komisyon metabolize etmeli)
Alex

4

Benim de sık sık bunun gibi şeyler lazım. afterBaşka bir işlem bittiğinde komut veren küçük bir yardımcı program yazdım . Bu gibi görünüyor:

#!/usr/bin/perl

my $pid = shift;
die "Usage: $0 <pid> <command...>" unless $pid =~ /^\d+$/ && @ARGV;

print STDERR "Queueing process $$ after process $pid\n";
sleep 1 while -e "/proc/$pid";
exec @ARGV;

Sonra böyle koşarsın:

% command1 arg1 arg2 ...  # creates pid=2853
% after 2853 command2 arg1 arg2 ... # creates pid=9564
% after 9564 command3 arg1 arg2 ...

Bunun diğer bazı yaklaşımlara göre en büyük avantajı, ilk işin herhangi bir özel şekilde çalıştırılması gerekmemesidir, yeni işinizle ilgili herhangi bir işlemi takip edebilirsiniz.


Güzel senaryo @ ken. Gerçi, zaman zaman buna ihtiyaç duyduğunuz için Görev Biriktiricisi'ni denemenizi tavsiye ederim. Cevabımı gör.
14'te

Temiz görünüyor, teşekkürler. TS’ten eksik olan tek şey, TS’de başlatılmayan işleri takip edebilmek gibi görünüyor. Sanırım amacı var olan bir sürecin bitmesini beklemek olan yeni bir TS işine başlayabilirsin.
Ken Williams,

Aslında. Bu, çözümünüzün faydalı bir yönüdür.
holmb

2

Komut1 ve Komut2

  • "&&", komut2'nin yalnızca komut1, 0 ​​dönüş koduyla bitirdikten sonra çalıştığı anlamına gelir.
  • Not: a || command2'nin yalnızca command1, 0 dışında bir dönüş kodu ile bittiğinde çalıştığı anlamına gelir.

1

Komutu çalıştıran kabuğun komut satırına komutları ekleyebilirsiniz.

Ya dikkatlice yazın ya da başka bir yere yazın, doğrulayın ve yapıştırın ve yapıştırın. Geçerli komut çıktı satırlarını dağıtıyor olsa bile, yeni bir şey yazabilirsiniz, enter tuşuna basın ve tüm komutlar tamamlanmadan önce girildiğinde veya girildiğinde çalışır.

Örnek izler. Her şeyi kesip yapıştırabilir veya birinciyi çalıştırırken (gerçekten çok hızlı yazarsanız) sonraki komutları girebilir veya 2. sırada çalışırken daha büyük olasılıkla:

echo "foo"
sleep 10; echo "bar"
sleep 3
echo "baz"

0

düşünebildiğim en hacik yol, / tmp içindeki basit kilit dosyaları ile "durum" sırasını korumaktır. file1.sh kendi cp komutlarını yaparken, bir kilit dosyasını (veya hardlink) / tmp dizininde tutar. bittiğinde dosyayı silin. diğer her komut dosyası, seçtiğiniz adlandırma düzenine sahip kilit dosyaları için / tmp dosyasına bakmak zorunda kalacaktır. doğal olarak bu her türlü hataya maruz kalır, ancak kurulması çok önemlidir ve tamamen bash içerisinde yapılabilir.


Uygulamada kullanımı zor, çünkü çalıştırmak istediğiniz her işin, dosyaları kilitlemek için değiştirilmesi ve dosyaların hangi kilit dosyalarını kullanacağını bilmesi (veya parametre olarak kabul etmesi) gerekir. Mümkün olduğunda, kuyruğa işin dışında olmak en iyisidir.
Ken Williams
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.