Como posso adicionar a um processo já em execução um comando 'shutdown' adicional?

11

Esqueci de adicionar regularmente && shutdown -h nowa um processo de execução demorada. Existe alguma maneira de adicionar um shutdown -h nowcomando depois que o primeiro comando foi chamado? Não se destina a interromper o processo em andamento. Talvez seja possível assistir ao PID?

brubaker
fonte
Espero que você perceba que o que vier depois &&será executado apenas se o comando anterior tiver sido bem-sucedido. Se você deseja que ele seja executado, mesmo que o comando falhe, use-o ;.
Zoke

Respostas:

13

Não é necessário executar ps repetidamente para listar todos os processos e grep na saída. Faça o plano de fundo do processo com ctrl-Z e execute

bg %1 ; wait %1 ; shutdown -h now

Se você tiver outros trabalhos em segundo plano em execução, receberá uma especificação de trabalho diferente em vez de [1] quando você pressionar Ctrl-z. Se sim, use isso em seu lugar.

psusi
fonte
3

Você pode fazer algo assim, que verificará se o processo está sendo executado a cada 5 segundos e tomará as ações apropriadas:

while true; do
  if ps -ef | grep -q '[l]ong-running-process'; then
    sleep 5
  else
    sudo poweroff
  fi
done

Observe os colchetes na grepexpressão. Isso é para garantir que o grepprocesso não seja correspondido se ele terminar na pslista. É possível cercar qualquer caractere único entre colchetes.

Scott Severance
fonte
+1, pois funciona. Não da maneira que eu teria feito.
Zoke
@Zoke: Se houver outra maneira, eu estaria interessado.
Scott Severance
Também postou uma resposta. Confira se quiser.
Zoke
Você também pode usar kill -0 (pid) para verificar a existência de um processo sem matá-lo.
macia
3

Eu faço isso toda hora.

  1. Inicie o processo.
  2. Perceba que eu esqueci de fazer o meu &&comando.
  3. Pressione Ctrl+ Zpara suspender o processo e retornar ao shell.
  4. Executar fg && shutdown -h nowpara:
    1. Primeiro plano e retome o processo que você acabou de suspender.
    2. Depois que terminar, ele executará o que você queria executar.

Como alternativa, você pode pesquisar como sugerido em outras respostas como esta:

while ps -p $PID ; do sleep 5 ; done ; shutdown -h now
Naftuli Kay
fonte
Isso será encerrado imediatamente.
Psusi
O fg termina imediatamente, então ...
psusi
@psusi não, não
Walking Wiki
@WalkingWiki, oh estranho, você está certo. Juro que testei isso em 2012 e foi concluído imediatamente.
Psusi
1

Se você conhece o pid, pode executar o seguinte:

while ps -p $PID; sleep 5; done; shutdown -h now

Para executar sem eco do ps, faça o seguinte:

while ps -p $PID >/dev/null; sleep 5; done; shutdown -h now

E, finalmente, executá-lo em segundo plano sem nenhuma saída:

(while ps -p $PID >/dev/null; sleep 5; done; shutdown -h now ) &

A solução de Scott é boa, mas isso elimina a necessidade greprepetidamente, se você já conhece o pid. E é muito mais rápido digitar.: P

Zoke
fonte
0

Faça um script de shell para executar os dois processos:

MyShellScript.txt:

#!/bin/sh
MyProcessIdLikeToStart -o options && shutdown -h now

Depois de salvar isso no diretório em que você inicia o processo especificado, faça um:

chmod +x MyShellScript.txt

Então, quando você quiser executar o comando, basta digitar ./MyShellScript.txte ele fará as duas coisas por você.

Chris Curry
fonte