2011-04-24 7 views
5

mio Makefile simile a questa:Ottenere ultimo processo PID in Makefile

setsid ./CppServer>daemon.log 2>&1 & 
echo $!>daemon.pid 

Cosa mi aspetto di fare è quello di memorizzare il PID di my_awesome_script nel file corrispondente. Tuttavia non c'è niente lì. Allora, dov'è il problema?

risposta

4

Se il tuo makefile sembra davvero questo si otterrà un errore, perché non vedo alcuna sintassi di make reale, solo la sintassi della shell. Tuttavia, la mia sfera di cristallo mi dice che queste due linee potrebbero essere parte della ricetta per una regola. Se lo sono, dovresti capire come eseguire ricette; per ogni riga viene creata una subshell separata, in cui il comando di quella riga viene eseguito indipendentemente: i due comandi non conoscono l'un l'altro dell'ambiente. Se vuoi che vengano eseguiti due comandi nella stessa subshell, dovresti rilasciarli come una riga (usando i caratteri di continuazione della linea se necessario), o usare la direttiva ONESHELL di make.

+1

Questo non è utile. Dimmi: perché è $! vuoto quando richiesto in Makefile? – nalply

+2

@nalply: è vuoto perché make non definisce una variabile con quel nome. Se vuoi usarlo nella shell devi sfuggire al simbolo del dollaro: '$$!', Ma devi essere consapevole della mia osservazione sull'emissione dei comandi su una riga, separati da es. un punto e virgola. – eriktous

+0

@eriktous ottima risposta, decisamente utile. Ho avuto il problema di nalply dopo, ovviamente il $$! risolve quello – David

0

La variabile che stai cercando di utilizzare stampa il pid dell'ultimo programma eseguito in background. È stato scritto correttamente come echo $! > nomefile.estensione. Ma dal momento che lo stai eseguendo nel foregorund hai due scelte. Esegui in background aggiungendo un & alla fine della riga ./script_to_run & oppure puoi stampare lo script stesso per archiviare il pid del processo attualmente in esecuzione utilizzando echo $$> nomefile.estensione (all'interno dello script). Ecco un link che potrebbe aiutarti http://tldp.org/LDP/abs/html/internalvariables.html

+0

Non è necessario aggiungere un ulteriore $ alla parte anteriore delle variabili interne. – rubixibuc

+0

Mi dispiace, il contenuto del Makefile che ho fornito nella domanda non era come nel vero Makefile (ho eseguito lo script in background). Ora è però. – Alex

+0

Sto eseguendo un programma, non uno script, e sto aggiungendo e invocando. Ma $! è ancora vuoto E ora? :-) – nalply