jak wykonać polecenie po bieżącym uruchomieniu polecenia w bash?

19

Pobieram plik za pomocą wget i chcę wyłączyć komputer po zakończeniu pobierania, ale muszę gdzieś teraz iść :) Czy możliwe jest wykonanie polecenia bash dokładnie, kiedy proces się zakończy?

Wiem, że to działa:

wget http://example.com/plik.rar; zamknij teraz

Ale co jeśli piszę tylko:

wget http://example.com/plik.rar
inothemo
źródło
2
Rozważ użycie && i || zamiast ;. i& i || sprawdź wartość zwrotną poprzedniego polecenia przed wykonaniem następnego polecenia ... na wypadek, gdyby wget się nie powiódł, możesz nie chcieć się zamknąć.
KFro

Odpowiedzi:

31

Możesz zrobić coś takiego:

  1. zatrzymać wykonywanie wget za pomocą ctrl-z (nie jest zatrzymane, jest zawieszone)
  2. umieść to w tle (bg)
  3. uruchom: poczekaj; zamknij -h teraz

wait będzie czekać na wszystkie programy uruchomione w tle z bieżącej powłoki - tj. tego wgeta.

Po zakończeniu oczekiwania nastąpi zamknięcie.


źródło
nie zapomnij wysunąć na pierwszy plan (fg) instancji wget po zakończeniu. Jeśli wget już działa, możesz umieścić go na pierwszym planie za pomocą ^ z (control-z).
Andrew Scagnelli,
4
Nie ma potrzeby, chyba że naprawdę chcesz zobaczyć pasek postępu.
dmckee,
Nie ma takiej potrzeby, ponieważ zostawia maszynę dla siebie, a następnie wyłącza się.
Wolf
11

W innej powłoce użyj

ps -u <your username> | grep wget

aby znaleźć PID polecenia, na które chcesz czekać

wait <PID>; shutdown -h now

aby zamknięcie nie uruchomiło się, dopóki proces się nie zakończy. Zobacz także odpowiedź depesz .

dmckee
źródło
+1, tylko uwaga: waitbędzie działać tylko dla poleceń uruchamianych z tej samej powłoki
Chriki,
5

Moje rozwiązania są następujące: zawieszenie długotrwałego zadania za pomocą Control + Z, a następnie wpisz coś takiego:

fg; echo "Done!"

Jeśli chcesz uruchomić, reaguj inaczej w zależności od powodzenia lub niepowodzenia polecenia, użyj && i || jako operatorzy zwarć.

fg && echo "Success!" || echo "Failure!"

EDYCJA: To nie będzie działać z sudo, ponieważ poprosi o twoje hasło. W związku z tym usunąłem przykłady za pomocą sudo. Jeśli potrzebujesz sudo do drugiego zadania, skorzystaj z innej metody zamieszczonej tutaj.

Z drugiej strony uważam, że zarówno GNOME, jak i KDE oferują sposoby na uruchomienie zamykania / restartowania bez użycia sudo, wysyłając odpowiedni sygnał D-Bus lub coś takiego.

Ryan C. Thompson
źródło
+1 za fg..., ale sudomoże być problem, jeśli wyświetli się monit o hasło
mark4o
Hmm Tak, nie użyłem tej sztuczki do sudo, gdy coś się kończy. W przypadku sudo potrzebujesz innej sztuczki. Zmienię odpowiednio swój post.
Ryan C. Thompson,
Moim zdaniem ta odpowiedź jest lepsza, ponieważ automatycznie umieszcza proces z powrotem na pierwszym planie
Cookie
Ponadto, hasła do sudo można wyłączyć (dla użytkownika i polecenia) - jeśli użytkownik może raz zamknąć sudo za jednym razem, może to zrobić zawsze. W niektórych przypadkach wrogie zamknięcie może nie być tak niebezpieczne - na pewno nie tak niebezpieczne, jak dostęp dla gości na uruchomionej maszynie.
Cookie,
1

Tak, po prostu wpisz drugie polecenie i naciśnij klawisz Enter. Jeśli bieżący program przewija tekst, nie widzisz, co wpisujesz poprawnie, więc uważaj na klawisze, aby zrobić to dobrze.

Mądrzejszym sposobem jest przejście do innego TTY (CTRL + ALT + F1 do F6) i uruchomienie polecenia jednocześnie, lub jeśli używasz programu wiersza polecenia, takiego jak screen, możesz utworzyć w nim nowe okno.

Tamara Wijsman
źródło
+1 za pierwszą opcję. Obawiam się, że nie rozumiem, jak powinna działać druga opcja.
innaM
Naciśnięcie na przykład CTRL + ALT + F2 spowoduje przejście do nowej drugiej konsoli, w której możesz się zalogować i wpisać polecenie, w ten sposób możesz uruchomić tam drugie polecenie. Po drugie, jeśli pobierzesz ekran (program do korzystania z konsoli w bardziej fantazyjny sposób), możesz otworzyć drugą kartę / okno, w którym możesz ponownie wpisać polecenia bez konieczności ponownego logowania. Ale ponieważ potrzebujesz go jednocześnie, możesz pozostać przy opcji 1, nie sądzę, że istnieje inny sposób na osiągnięcie tego samego efektu. Chyba że użyjesz innego okna TTY / do sprawdzenia skryptu, czy proces nadal działa. :-P
Tamara Wijsman
Skorzystaj z PID oczekiwania z odpowiedzi dmckee
Cookie,
1

Jeśli chcesz się podobać, sprawdź status zwrotu widgetu i wyłącz go tylko wtedy, gdy się powiedzie.

% wget http://example.com/file.rar
% if [ $? -eq 0 ]
> then
> shutdown now
> fi
Doug Harris
źródło
2
Jest to dobre podejście podczas tworzenia skryptów, ale podczas wgeturuchomień nie pojawia się monit o zbudowanie testu.
dmckee,
Możesz to połączyć z moją sztuczką Control-Z i fg, aby obejść ten problem.
Ryan C. Thompson,