Muszę dużo kopiować różne pliki do różnych folderów. Mogę dodać wszystkie moje polecenia kopiowania do skryptu bash, a następnie uruchomić je, ale muszę poczekać, aż zakończy się, jeśli chcę dodać więcej poleceń do tej „kolejki” kopiowania.
Czy istnieje sposób, w jaki mogę uruchamiać polecenia jako kolejkę i dodawać kolejne polecenia do tej kolejki podczas działania?
Wyjaśnione w inny sposób, chcę rozpocząć długotrwałe zadanie. Podczas działania chcę uruchomić inny, który nie uruchomi się, dopóki nie zostanie ukończony pierwszy. A potem dodaj kolejne po tym ostatnim i tak dalej. Czy to jest jakoś możliwe?
Odpowiedzi:
at
Narzędzie, najlepiej znany z systemem poleceń w określonym czasie, posiada również funkcję kolejki i może zostać poproszony, aby rozpocząć poleceń uruchomionych teraz. Odczytuje polecenie uruchomienia ze standardowego wejścia.batch
Komenda jest równoważnaat -q b -m now
(-m
czyli wyjście polecenia, jeśli w ogóle, zostanie wysłany do Ciebie, jak cron robi). Nie wszystkie warianty unixowe obsługują nazwy kolejek (-q myqueue
); możesz być ograniczony do jednej kolejki o nazwieb
. Linuxat
jest ograniczony do jednoliterowych nazw kolejek.źródło
now
nie-t now
, przepraszam. Nie zauważyłem, że popełniłem błąd w przykładowym kodzie.Dołącz
&
na końcu polecenia, aby wysłać go w tle, a następniewait
na nim przed uruchomieniem następnego. Na przykład:źródło
wait
? Wydaje się to niewrażliwe na wszystkie moje zabójcze strzały.wait
prostu zatrzymuje pracę, dopóki poprzednie nie zakończą.nohup
?Zarówno rozwiązania Brada, jak i Mankoffa są dobrymi sugestiami. Innym, który jest podobny do kombinacji obu z nich, byłoby użycie GNU Screen do implementacji twojej kolejki. Ma to tę zaletę, że może działać w tle, możesz to sprawdzić za każdym razem, a kolejkowanie nowych poleceń po prostu wkleja je do bufora, który ma zostać wykonany po wyjściu poprzednich poleceń.
Pierwszy bieg:
(nawiasem mówiąc, teraz jest dobry moment na zabawę z niesamowitymi plikami . screenrc )
Spowoduje to utworzenie sesji ekranu w tle dla Ciebie o nazwie kolejka.
Teraz ustaw w kolejce tyle poleceń, ile chcesz:
Wykonuję wiele powyższych poleceń tylko w celu testowania. Twój przypadek użycia prawdopodobnie wyglądałby bardziej jak:
Zauważ, że „^ M” w moim wierszu powyżej to sposób na osadzenie nowej linii, która zostanie zinterpretowana później, gdy screen włoży ją do istniejącej powłoki bash. Użyj „CTL-V”, aby uzyskać tę sekwencję.
Stworzenie prostych skryptów powłoki do automatyzacji i ustawiania w kolejce poleceń byłoby dość łatwe. Następnie za każdym razem, gdy chcesz sprawdzić stan swojej kolejki w tle, ponownie dołączasz za pomocą:
Technicznie rzecz biorąc, nie musisz nawet nazywać swojej sesji ekranowej i będzie ona działała dobrze, ale kiedy już ją wciągniesz, i tak będziesz chciał pozostawić ją uruchomioną przez cały czas. ;-)
Oczywiście, jeśli to zrobisz, innym dobrym sposobem na to byłoby nazwanie jednego z obecnych okien „kolejką” i użycie:
źródło
Istnieje narzędzie, które z dużym powodzeniem wykorzystałem do dokładnie opisywanego przypadku użycia. Niedawno przeniosłem mój główny laptop na nowy sprzęt, co wymagało przeniesienia niektórych plików na serwer NAS, a resztę na nowy komputer.
Tak to zrobiłem.
Skonfiguruj wszystkie komputery związane z połączeniem sieciowym, aby mogły się nawzajem kontaktować.
Na komputerze, z którego przenosisz pliki (zwanym dalej maszyną źródłową), zainstaluj program rsync zi narzędzie do buforowania zadań
apt-get install rsync
tajnego sosu (strona internetowa http://vicerveza.homeunix.net/~viric/soft/ts/ ). Jeśli korzystasz z Debiana, nazwa pakietu to i nazwa pliku wykonywalnego zostaje zmieniona, aby uniknąć kolizji nazwy z plikiem wykonywalnym z pakietu. Pakiet Debian, do którego odsyłacz znajduje się na stronie internetowej, można doskonale zainstalować na Ubuntu z podobnym oprogramowaniem.ts
task-spooler
tsp
ts
moreutils
dpkg -i task-spooler_0.7.3-1_amd64.deb
Upewnij się również, że wszystkie maszyny mają zainstalowany SSH
apt-get install openssh-server
. Na komputerze źródłowym musisz skonfigurować SSH, aby umożliwić logowanie bez hasła do komputerów docelowych. Metodą najczęściej używaną jest uwierzytelnianie za pomocą klucza publicznegossh-agent
( przykłady: https://www.google.se/search?q=ssh+public+key+authentication ), ale czasami używam łatwiejszej metody, która działa tylko a także z uwierzytelnianiem za pomocą hasła. Dodaj następujące elementy do konfiguracji klienta SSH (albo~/.ssh/config
lub/etc/ssh/ssh_config
):Następnie otwórz jeden terminal na maszynie źródłowej, zaloguj się
ssh target1
, uwierzytelnij jak zwykle, a następnie pozostaw ten terminal otwarty. Zauważ, że istnieje plik o nazwie o nazwie~/.ssh/master-user@target1:22
, jest to plik, który utrzyma uwierzytelnioną sesję główną otwartą i umożliwi kolejne połączenia bez hasłauser
(o ile połączenie używa tej samej docelowej nazwy hosta i portu).W tym momencie musisz sprawdzić, czy możesz się zalogować bez pytania o uwierzytelnienie na komputerach docelowych.
Teraz uruchom
ts rsync -ave ssh bigfile user@target1:
dla pojedynczego pliku lubts rsync -ave ssh bigdir user@target1:
katalogu. W przypadku rsync ważne jest, aby nie dołączać ukośnika końcowego w katalogu (wbigdir
porównaniu dobigdir/
), ponieważ rsync zakłada, że miałeś na myśli odpowiednikbigdir/*
większości innych narzędzi.Bufor zadań zwróci monit i umożliwi kolejkowanie wielu z tych poleceń kolejno. Sprawdź kolejkę uruchamiania
ts
bez argumentów.Bufor zadań ma wiele funkcji, takich jak zmiana kolejności kolejki uruchamiania, uruchamianie określonego zadania tylko wtedy, gdy inne zadanie przebiegło pomyślnie itp. Przejrzyj pomoc za pomocą
ts -h
. Czasami sprawdzam dane wyjściowe polecenia, gdy jest ono uruchomionets -c
.Istnieją inne metody wykonania tej czynności, ale w twoim przypadku użycia wszystkie one zawierają bufor zadań. Wybieram użycie rsync przez SSH, aby zachować znaczniki czasu plików, których kopiowanie przez SMB nie miałoby.
źródło
ts
, wydaje się bardzo potężny i łatwy w użyciu, po prostu rozwidlony na github z autoolowaniem i debianizacją.task-spooler
:-) ... tak czy inaczej, to w twoim komentarzu jest bardzo dobra sugestia, zrobię to wkrótce.Potrzebuję też takich rzeczy dość często. Napisałem małe narzędzie o nazwie,
after
które wykonuje polecenie za każdym razem, gdy zakończy się jakiś inny proces. To wygląda tak:Następnie uruchom go tak:
Dużą zaletą tego w porównaniu z innymi podejściami jest to, że pierwsze zadanie nie musi być uruchamiane w żaden specjalny sposób, możesz śledzić każdy proces z nowym zleceniem.
źródło
Command1 i& Command2
źródło
Możesz po prostu dodać polecenia do wiersza poleceń powłoki, która już uruchamia polecenie.
Albo pisz ostrożnie, albo pisz w innym miejscu, sprawdź i wytnij i wklej. Nawet jeśli bieżące polecenie wyrzuca linie wyjściowe, nadal możesz wpisać coś nowego, nacisnąć klawisz Enter, a uruchomi się ono, gdy wszystkie polecenia zostaną uruchomione lub wprowadzone przed zakończeniem.
Przykład poniżej. Możesz wyciąć i wkleić całość lub wprowadzić kolejne polecenia, gdy pierwsza jest uruchomiona (jeśli wpisujesz naprawdę bardzo szybko), lub bardziej prawdopodobne, gdy druga jest uruchomiona:
źródło
najgorszym sposobem, jaki mogę wymyślić, jest utrzymanie „stanu” kolejki za pomocą prostych plików blokujących w / tmp. gdy plik1.sh wykonuje polecenia cp, zachowa plik blokady (lub hardlink) w / tmp. po zakończeniu usuń plik. każdy inny skrypt będzie musiał szukać w / tmp plików blokujących z wybranym schematem nazewnictwa. naturalnie jest to podatne na wszelkiego rodzaju awarie, ale konfiguracja jest banalna i jest wykonalna całkowicie w ramach bash.
źródło