2011-12-01 15 views
6

Ho uno script per lanciare da avviare che avvia un server, quindi dice di uscire con garbo quando launchd lo uccide (che dovrebbe essere all'arresto). La mia domanda: qual è il modo appropriato e idiomatico di dire alla sceneggiatura di rimanere inattiva finché non riceve il segnale? Dovrei semplicemente usare un ciclo while-true-sleep-1, o c'è un modo migliore per farlo?Bash - Come dovrei restare inattivo finché non ottengo un segnale?

#!/bin/bash 

cd "`dirname "$0"`" 

trap "./serverctl stop" TERM 
./serverctl start 

# wait to receive TERM signal. 
+2

'while:; dormi 1; done' sembra OK per me. – choroba

+1

Puoi ottenere il PID del processo generato da 'serverctl'? Con 'jobs -p' o' pgrep -P'? –

+0

L'attuale processo del server è in esecuzione in una sessione 'screen'. Potrebbe non essere una cattiva idea attenderlo, in modo che un'uscita inaspettata causi la fine di questo script e avvisi all'avvio che il processo non funziona. D'altra parte, sono passati quindici mesi e funziona bene così com'è. :-P –

risposta

2

Un piano wait sarebbe significativamente meno dispendioso di risorse rispetto a un blocco di selezione, anche con un sonno in esso.

+2

Non sto iniziando nessun processo in background: come sarebbe il lavoro in attesa qui? –

+0

Attendi una lettura di un fittizio fifo, cioè crea un fifo, quindi chiama "read Stabledog

+0

Oppure aspetta solo il PID del demone che sembra stia iniziando. – tripleee

2

Perché desideri mantenere in esecuzione il tuo script? C'è qualche ragione? Se non fai niente dopo il segnale, non vedo una ragione per questo.

Quando si termina TERM allo spegnimento, il server e il server eseguibile (se ce n'è uno) ricevono anche TERM allo stesso tempo.

Per fare questa cosa in base alla progettazione, è necessario installare lo script serverctl come script rc e consentire a init (start e) di interromperlo. Here Ho descritto come configurare il processo del server che non è stato originariamente progettato per funzionare come server.

+0

Serverctl non riceverà un TERMINE perché non persiste. L'attuale processo persistente è un server di Minecraft, che non posso modificare e che morirà immediatamente quando avrà un TERM. Inoltre, rc (che sarebbe altrimenti il ​​modo ovvio per farlo) è deprecato su Mac OS. –

1

È possibile utilizzare semplicemente "sleep infinity". Se si desidera eseguire più azioni alla chiusura e non vogliono creare una funzione per questo, un'alternativa potrebbe essere:

#!/bin/bash 
sleep infinity & PID=$! 
trap "kill $PID" INT TERM 

echo starting 
# commands to start your services go here 

wait 

# commands to shutdown your services go here 
echo exited 

Un'altra alternativa per "infinito sonno" (sembra busybox non supporta per esempio) potrebbe essere "tail -fn0 $ 0" per esempio.

Problemi correlati