Existe uma maneira de fornecer tarefas seriais no terminal enquanto uma tarefa está em execução (sem usar um arquivo)?

14

Suponha que existam 2 tarefas t1, t2que podem ser executadas de maneira serial, como abaixo:

t1 ; t2
# OR
t1 && t2

Agora, suponha que eu esqueci de executar t2e t1já esteja executando; posso adicionar t2ao pipeline para que ele seja executado após a t1conclusão?

Abhimanyu Gupta
fonte

Respostas:

19

Sim você pode:

  1. Pause o trabalho atualmente em execução com o caractere de suspensão pressionando Ctrl+ Z.
  2. Digite fgou %adicione o que deseja à lista e execute-o, por exemplo:
    fg ; systemctl suspend # or
    % ; systemctl suspend
    Como fgretorna o valor de retorno do trabalho retomado, liste os operadores como &&e ||trabalhem conforme o esperado:
    fg && echo "Finished successfully!" # or
    % && echo "Finished successfully!"

man bash/ JOB CONTROL diz sobre o caractere de suspensão:

Digitando a suspender personagem (normalmente ^Z, Control- Z), enquanto um processo está sendo executado causas desse processo ser interrompido e retorna o controle para bash. (…) O usuário pode manipular o estado desse trabalho, usando o bgcomando para continuar em segundo plano, o fg comando para continuar em primeiro plano ou o killcomando para eliminá-lo. A ^Zentra em vigor imediatamente e tem o efeito colateral adicional de fazer com que a saída pendente e o cabeçote de impressão sejam descartados.

fgé explicado em man bash/ SHELL BUILTIN COMMANDS :

fg [ jobspec ]
Resume jobspec em primeiro plano, e torná-lo o trabalho atual. Se o jobspec não estiver presente, será usada a noção do shell do job atual. O valor de retorno é o do comando colocado em primeiro plano, ou falha se executado quando o controle de trabalho estiver desativado ou, quando executado com o controle de trabalho ativado, se jobspec não especificar um trabalho válido ou jobspec especificar um trabalho iniciado sem controle de trabalho .

Leitura adicional (além de man bash) sobre controle de trabalho:

sobremesa
fonte
+1, mas é uma pena que isso não funcione quando você se esquece t3de t1; t2; t3ou t1 && t2 && t3.
JoL
@JoL É verdade que - ^Z^Ze %-;%+;t3é bom o suficiente em alguns casos, mas está longe de ser uma solução real para o problema.
dessert
2

Eu vi esse método aqui: /superuser/334272/how-to-run-a-command-after-an-already-running-existing-existing-one-finishes

onde você faz Ctrl+ zpara parar (suspender) o comando em execução, executa o comando perdido da seguinte maneira: fg && ./missed_cmd.she ele será executado assim que fgterminar.

O fg(comando em primeiro plano) colocará o trabalho suspenso online e &&garantirá que o comando perdido seja executado apenas se o primeiro comando for bem-sucedido.

George Udosen
fonte