Scrivi manualmente un file PID dallo script Bash


10

Come potrei scrivere uno script Bash che esegue un programma a esecuzione prolungata e memorizza l'id del processo dei programmi in un file separato?

Voglio qualcosa del genere

#!/bin/bash
exec long_running_tool
echo `ps af |grep "long_running_tool" |awk '$5 == "long_running_tool" {print $1}'` > pid_file

Tuttavia, facendo esattamente questo, l'esecuzione dello strumentops dopo è terminata.

C'è un modo per ottenere l'ID processo del processo creato?


2
Il codice di esempio non funzionerà perché exec non esegue il fork, quindi il processo shell viene sostituito dal long_running_toolprocesso. Di conseguenza, exec non ritorna mai e la seguente riga non viene mai raggiunta. Vedi help exec, execve(2).
Etienne Dechamps,

@ e-t172 grazie per averlo sottolineato. Allora cancello 'exec'.
DerMike,

Risposte:


12

Puoi facilmente eseguire il processo in background con "&", quindi ottenere il PID del processo in background usando "$!"

#!/bin/bash
long_running_tool &
echo $! > pid_file

Quindi, facoltativamente, aspetta $! se si desidera bloccare la shell fino al completamento dell'esecuzione del processo.


1
AGGIORNAMENTO: quando uso fg ottengo 'fg: 21: lavoro (null) non creato sotto il controllo lavoro' e lo script non si blocca. Scusate.
DerMike,

"aspetta $!" dovrebbe avere un effetto simile a fg che posso confermare, infatti, funziona in uno script. Probabilmente avrei dovuto verificarlo prima di pubblicare. >.> il mio male.
Jeremy Sturdivant,

9
#!/bin/bash
echo $$ > fooapp.pid
exec fooapp

Come accennato in precedenza, exec sostituisce bash con il programma specificato, mantenendo il PID.

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.