como executar o comando após o comando em execução no bash?

18

Estou baixando um arquivo com o wget e quero desligar o computador após a conclusão do download, mas preciso ir a algum lugar agora :) É possível executar o comando no bash exatamente quando o processo for concluído?

Eu sei que isso funciona:

wget http://example.com/file.rar; desligamento agora

Mas e se eu digitar apenas:

wget http://example.com/file.rar
inothemo
fonte
2
Considere usar && e || ao invés de ;. && e || verifique o valor de retorno do comando anterior antes de executar o próximo comando ... caso o wget falhe, talvez você não queira desligar.
KFro

Respostas:

31

Você pode fazer algo assim:

  1. interrompe a execução do wget com ctrl-z (não é interrompido, está suspenso)
  2. colocá-lo em segundo plano (bg)
  3. executar: esperar; shutdown -h now

wait irá esperar por todos os programas executados em segundo plano a partir do shell atual - ou seja, este wget.

Após a espera terminar - o desligamento continuará.


fonte
não esqueça de colocar em primeiro plano (fg) sua instância do wget quando terminar. Se o wget já estiver em execução, você poderá colocá-lo em primeiro plano com ^ z (control-z).
Andrew Scagnelli
4
Não é necessário, a menos que você realmente queira ver a barra de progresso.
dmckee
Não há necessidade, pois ele está deixando a máquina sozinha e depois desligado.
Wolf
11

Em outro shell, use

ps -u <your username> | grep wget

para encontrar o PID do comando que você deseja aguardar,

wait <PID>; shutdown -h now

para que o desligamento não seja executado até o processo terminar. Veja também a resposta de depesz .

dmckee
fonte
+1, apenas uma nota: waitsó funcionará para os comandos iniciados a partir do mesmo shell
Chriki
4

Minhas soluções são: suspenda sua tarefa de longa duração com Control + Z e digite algo como:

fg; echo "Done!"

Se você deseja executar a reação de maneira diferente com base no sucesso ou falha do seu comando, use && e || como operadores de curto-circuito.

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

EDIT: Isso não funcionará com o sudo, porque solicitará sua senha. Portanto, removi os exemplos usando o sudo. Se você precisar do sudo para a segunda tarefa, use outro dos métodos publicados aqui.

Por outro lado, acredito que o GNOME e o KDE oferecem maneiras de acionar um desligamento / reinicialização sem usar o sudo, enviando um sinal D-Bus apropriado ou algo assim.

Ryan C. Thompson
fonte
+1 para fg..., mas sudopoderia ser um problema se ele solicita uma senha
mark4o
Hmm. Sim, eu não usei esse truque para sudo coisas quando algo termina. Para o sudo, você precisaria de um truque diferente. Vou editar minha postagem de acordo.
22139 Ryan C. Thompson
Para o meu propósito esta resposta é superior, uma vez que coloca o processo automaticamente de volta para o primeiro plano
Cookies
Além disso, as senhas para o sudo podem ser desabilitadas (por usuário e por comando) - se o usuário tiver permissão para desligar via sudo dessa vez, ele poderá fazê-lo sempre. Um desligamento hostil pode não ser tão perigoso em alguns casos - certamente não tão perigoso quanto um acesso de convidado comprometido em uma máquina em execução.
Cookie
1

Sim, basta digitar seu segundo comando e pressionar enter. Se o seu programa atual estiver rolando texto, você não poderá ver o que está digitando corretamente; portanto, observe as teclas para fazer o que é correto.

Uma maneira mais inteligente é alternar para outro TTY (CTRL + ALT + F1 a F6) e executar o comando simultaneamente ou, se você estiver usando um programa de linha de comando como a tela, poderá criar uma nova janela nele.

Tamara Wijsman
fonte
+1 para a primeira opção. Receio não entender como a segunda opção deve funcionar.
innaM 03/09/09
Pressionar, por exemplo, CTRL + ALT + F2 o levará a um novo segundo console, no qual você poderá efetuar login e digitar um comando, dessa forma, poderá executar um segundo comando nesse local. Segundo, se você baixar a tela (um programa para usar seu console de uma maneira mais sofisticada), poderá abrir uma segunda guia / janela onde poderá digitar novamente os comandos, sem precisar fazer login novamente. Mas, como você precisa simultaneamente, pode ficar com a opção 1, acho que não há outra maneira de obter o mesmo efeito. A menos que você use outro TTY / window para verificar um script se o processo ainda estiver em execução. :-P
Tamara Wijsman 04/09/09
Use a espera PID de resposta de dmckee
Cookies
1

Se você quiser ser chique, verifique o status de retorno do wget e encerre apenas se tiver sido bem-sucedido.

% wget http://example.com/file.rar
% if [ $? -eq 0 ]
> then
> shutdown now
> fi
Doug Harris
fonte
2
Essa é uma boa abordagem wgetao criar scripts, mas durante a execução, você não recebe um prompt de volta para criar o teste.
dmckee
Você pode combinar isso com o meu Control-Z e truque fg para contornar isso.
22139 Ryan C. Thompson