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?


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.


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.


+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

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


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ê.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.