|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jun 2005
Messaggi: 1376
|
[C/C++ Linux Suse] Monitoraggio di un PID
Salve a tutti, ho bisogno di tenere sotto controllo un eseguibile, rilanciandolo se va giù o chiudendolo se si determina una certa situazione, pensavo quindi di realizzare un eseguibile che lancia questa applicazione e ne monitorizza il pid, rilanciandola se si chiude. Entrambe queste applicazioni poi devono essere lanciate in background da uno script e terminate da un altro. Non essendo pratico di createprocess e simili potete darmi una mano?
Ciao |
|
|
|
|
|
#2 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
CreateProcess su Linux...?
su Linux c'è solo fork/exec |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Usa fork() e quando controlli il valore di ritorno con wait() verifica che sia un valore accettabile e non un codice di errore, in tal caso ripeti l'operazione e lanci di nuovo l'eseguibile. Non dovrebbe essere molto difficile.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
|
Ciao,
generalmente questi tipi di problemi si risolvono facilmente con uno script: ti basta fare un ps -ef | grep nome_eseguibile e se il ritorno e' nullo, rilanci l'applicazione
__________________
In God we trust; all others bring data |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jun 2005
Messaggi: 1376
|
Intanto grazie a tutti per le risposte.
Lo script che fa questa cosa con il ps già c'è (tra l'altro non è così facile perchè se l'eseguibile non è in esecuzione cmq tra i processi ti fa vedere il grep...), il problema è che a sua volta deve essere chiuso da un altro script e non si riesce a fare perchè il ps non so per quale motivo non lo "vede", per questo volevo usare un eseguibile invece di uno script. La fork non va bene perchè sono 2 eseguibili diversi (oppure sono io che non so come usarla, ma dal man mi pare di aver capito che posso "forkare" solo all'interno dello stesso eseguibile e non lanciarne un altro). Cmq ho risolto facendo scrivere dall'applicazione il timestamp ogni secondo in un file e controllandolo dall'altro applicativo, quando non mi scrive più per 20" vuol dire che è giù e lo rilancio. E' un pò brutto ma per quello che mi serve va bene. Piuttosto ora ho altri 2 problemi: l'applicazione principale mi da anche il suo pid, che io utilizzo in caso di chiusura (sempre dall'applicazione che monitorizza) lanciando system ("kill xxxx"); il problema è che non termina. Il pid è giusto, tanto è vero che se lo faccio da console funziona, invece chiamato tramite system non va. Altra questione, come faccio a sapere (in codice C) se un eseguibile è già in esecuzione, per evitare di lanciare più istanze? Ciao e grazie della pazienza |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7260
|
devi usare una exec se vuoi lanciare un eseguibile esterno
ps. ma ps (scusa il gioco di parole) con che opzioni lo lanci? se scrivi solo ps infatti ti mostra solo i processi lanciati da quella shell.. io uso l'opzione -A se vuoi più dettagli usa -ef come ha detto prima sottovento Ultima modifica di k0nt3 : 15-05-2006 alle 21:22. |
|
|
|
|
|
#7 | ||
|
Senior Member
Iscritto dal: Jun 2005
Messaggi: 1376
|
Quote:
Quote:
|
||
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7260
|
se usi exec il pid è lo stesso del programma che lancia la exec perchè non fa altro che sostituire il segmento di codice nuovo dentro il processo.
quindi per risolvere il tuo problema dovresti fare una fork e nel figlio fare una exec (in questo modo conosci il pid che ti viene restituito dalla funzione getpid() dentro il figlio) |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7260
|
una cosa di questo tipo per intenderci:
Codice:
...
pid = fork();
if(pid == 0)
{
// figlio
pidFiglio = getpid();
execl("/path/nome_eseguibile", "parametro1", "parametro2", NULL);
exit(0);
}
else
{
// padre
fai qualcosa con il pid del figlio;
exit(0);
}
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7260
|
adesso che ci penso la variabile pidFiglio non conterrà il pid del figlio quando sei nel padre.. però potresti scriverlo tipo in un file. sarebbe più elegante usare i thread altrimenti
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Mar 2004
Messaggi: 1451
|
Quote:
__________________
Ciao ~ZeRO sTrEsS~ |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7260
|
Quote:
|
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: Mar 2004
Messaggi: 1451
|
Quote:
__________________
Ciao ~ZeRO sTrEsS~ |
|
|
|
|
|
|
#14 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
intendeva solo dire che essendosi creato un nuovo processo, ora esistono due spazi di memoria distinti.
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Dec 2005
Messaggi: 7260
|
Quote:
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:34.



















