Posso de alguma forma adicionar um “&& prog2” a um prog1 já em execução?

87

A maioria das shells fornece funções como && e ; para encadear a execução de comandos de determinadas maneiras. Mas e se um comando já estiver em execução, ainda posso de alguma forma adicionar outro comando a ser executado, dependendo do resultado do primeiro?

Digamos que eu corri

$ /bin/myprog
some output...

mas eu realmente queria /bin/myprog && /usr/bin/mycleanup . Eu não posso matar myprog e reiniciar tudo porque muito tempo seria perdido. Eu posso Ctrl + Z e fg / bg , se necessário. Isso me permite encadear outro comando?

Estou mais interessado em bash, mas as respostas para todos os shells comuns são bem-vindas!

    
por us2012 11.11.2013 / 19:56

4 respostas

118

Você deve conseguir fazer isso no mesmo shell em que está usando o comando wait :

$ sleep 30 &
[1] 17440

$ wait 17440 && echo hi

...30 seconds later...
[1]+  Done                    sleep 30
hi

trecho da página man do Bash

wait [n ...]
     Wait for each specified process and return its termination status. Each n 
     may be a process ID or a job specification; if a job spec is given,  all 
     processes  in that job's pipeline are waited for.  If n is not given, all 
     currently active child processes are waited for, and the return status is 
     zero.  If n specifies a non-existent process or job, the return status is 
     127.  Otherwise, the return status is the exit status of the last process 
     or job waited for.
    
por 11.11.2013 / 20:32
63

fg retorna com o código de saída do programa que é retomado. Você pode, portanto, suspender seu programa com ^ Z e, em seguida, usar fg && ... para continuá-lo.

$ /bin/myprog
some output...
^Z
[1]+ Stopped              /bin/myprog
$ fg && /usr/bin/mycleanup
    
por 12.11.2013 / 00:56
1

Não tenho certeza se o que você está pedindo é possível, mas se você ainda tiver o shell do qual iniciou o programa, sempre poderá verificar $? para o status de saída do último processo:

$ /bin/myprog
some output...
$ if [ $? -ne 0 ];then echo "non-zero exit status";else echo "0 exit status";fi
    
por 11.11.2013 / 20:11
1

Se o trabalho estiver em primeiro plano, qualquer um desses comandos terá o mesmo comportamento que você espera.

[ $? -eq 0 ] && prog2
(( $? )) || prog2

NOTA: $? conterá o status de retorno do programa em execução quando ele sair.

Isso está declarando explicitamente o que o shell faria se você tivesse originalmente inserido o comando.

prog1 && prog2

Se o primeiro comando não estiver lendo em stdin e estiver sendo executado em primeiro plano, o novo comando poderá ser inserido enquanto o primeiro comando estiver em execução. O shell irá ler e executar quando o primeiro comando for executado. Se o comando for executado em segundo plano, é improvável que ele esteja lendo stdin .

EDIT: Colocar o trabalho em segundo plano e usar o comando WAIT também pode ser usado. Isso deve ser feito com cuidado se outros trabalhos também tiverem sido executados em segundo plano. Uma especificação de trabalho é necessária para que o comando WAIT retorne o status do trabalho aguardado.

    
por 11.11.2013 / 20:12