Come posso aggiungere a un processo già in esecuzione un comando aggiuntivo 'shutdown'?


11

Su base regolare dimentico di aggiungere && shutdown -h nowa un processo di lunga durata. C'è un modo per aggiungere un shutdown -h nowcomando dopo che è stato invocato il primo comando? Non ha lo scopo di interrompere il processo in corso. Forse è possibile guardare il PID?


Spero che ti renda conto che tutto ciò che verrà dopo &&verrà eseguito solo se il comando precedente ha avuto successo. Se si desidera che venga eseguito anche se il comando non riesce, utilizzare ;invece.
Zoke,

Risposte:


13

Non è necessario eseguire ripetutamente ps per elencare tutti i processi e passare attraverso l'output. Esegui lo sfondo del processo con ctrl-Z, quindi esegui

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

Se hai altri lavori in background in esecuzione, ti verrà dato un altro jobspec invece di [1] quando premi ctrl-z. In tal caso, utilizzare quello.


3

Potresti fare qualcosa del genere, che controllerà se il processo è in esecuzione ogni 5 secondi e prenderà le misure appropriate:

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

Nota le parentesi quadre grepnell'espressione. Questo per garantire che il grepprocesso non venga abbinato se finisce psnell'elenco. È sufficiente circondare un singolo carattere con parentesi quadre.


+1 poiché funziona. Non come l'avrei fatto io.
Zoke,

@Zoke: se c'è un altro modo, sarei interessato.
Scott Severance,

Ha anche pubblicato una risposta. Dai un'occhiata se ti piace.
Zoke,

Puoi anche usare kill -0 (pid) per verificare l'esistenza di un processo senza ucciderlo.
soffice

3

Lo faccio sempre.

  1. Inizia il processo.
  2. Renditi conto che ho dimenticato di eseguire il mio &&comando.
  3. Premi Ctrl+ Zper sospendere il processo e tornare alla shell.
  4. Corri fg && shutdown -h nowa:
    1. Primo piano e riprendi il processo che hai appena sospeso.
    2. Quindi, al termine, eseguirà ciò che si desidera eseguire.

In alternativa, puoi eseguire il polling come suggerito in altre risposte come questa:

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

Questo si spegnerà immediatamente.
psusi

La fg si completa subito, quindi ...
psusi

@psusi no non lo farà
Walking Wiki

@WalkingWiki, oh strano, hai ragione. Giuro di averlo provato nel 2012 e che è stato completato immediatamente.
psusi,

1

Se conosci il pid puoi eseguire questo:

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

Per eseguire senza eco da ps, procedere come segue:

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

E infine per eseguirlo in background senza alcun output:

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

La soluzione di Scott è buona, ma ciò elimina la necessità di grepripetere se già conosci il pid. Ed è molto più veloce digitare.: P


0

Crea uno script shell per eseguire entrambi i processi:

MyShellScript.txt:

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

Dopo averlo salvato nella directory in cui si avvia il processo specificato, eseguire una:

chmod +x MyShellScript.txt

Quindi, quando vuoi eseguire il comando, digita ./MyShellScript.txte farà entrambe le cose per te.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.