View Full Version : Bloccare un file ".jar"
Ciao a tutti,
volevo sottoporvi una questione... cercherò di essere il più preciso possibile.
Ho un'applicazione scritta in JAVA che gira su una macchina con SO "Ubuntu 13.10". Gira come applicazione ".jar".
Siccome questa applicazione, sotto determinate condizioni, si blocca volevo sapere se esiste la possibilità di creare, sempre in JAVA, un'altra applicazione "supervisore" che monitora il lavoro della prima e la chiude in caso si blocchi.
Al momento uso codice scritto direttamente da SO, in sostanza uso la parola chiave "kill" per chiudere il ".jar" e poi lo faccio ripartire. Come posso by-passare questa operazione?
Grazie mille in anticipo!!!
clockover
10-02-2014, 13:18
Ciao a tutti,
volevo sottoporvi una questione... cercherò di essere il più preciso possibile.
Ho un'applicazione scritta in JAVA che gira su una macchina con SO "Ubuntu 13.10". Gira come applicazione ".jar".
Siccome questa applicazione, sotto determinate condizioni, si blocca volevo sapere se esiste la possibilità di creare, sempre in JAVA, un'altra applicazione "supervisore" che monitora il lavoro della prima e la chiude in caso si blocchi.
Al momento uso codice scritto direttamente da SO, in sostanza uso la parola chiave "kill" per chiudere il ".jar" e poi lo faccio ripartire. Come posso by-passare questa operazione?
Grazie mille in anticipo!!!
La cosa migliore da fare è capire perchè l'applicazione si blocca. Hai scritto tu il programma che si blocca? Esiste un file di log?
La cosa migliore da fare è capire perchè l'applicazione si blocca. Hai scritto tu il programma che si blocca? Esiste un file di log?
No non l'ho scritto io ma ho il codice sorgente... il problema è che per debuggarlo devo andare fisicamente sul sito dove si trova la macchina. Lo farò, ma nel mentre devo pensare a tutti i metodi che posso usare nel caso non riesca a capire come correggere il codice direttamente.
Uno dei piani (tipo piano "c") è questo che ho appena descritto.
Ho già pensato di creare un thread che supervisioni il programma che si blocca(che quindi diventerebbe un thread "figlio"), il problema è che girando su Linux, per la gestione di scheduling che ha, potrei creare dei problemi "sincronismo" fra tutti i thread che così creerò.
Per quanto riguarda il motivo che blocca l'applicazione originale, è un problema di connessione. Ho un socket che prende i dati da un server, ma se la connessione cade per più di un minuto circa il sistema si blocca... ma ripeto ancora devo debuggaarlo in locale quindi è difficile anche per me essere chiaro ed esauriente!
Daniels118
10-02-2014, 14:04
Come ti è stato già detto la cosa migliore da fare è correggere il programma. L'istruzione che apre la connessione ha un parametro che consente di impostare il timeout. Se questo viene raggiunto viene sollevata un'eccezione che puoi intercettare e gestire in modo opportuno.
Per rispondere alla tua domanda poi, cosa c'è che non va con il metodo che hai già adottato?
Come ti è stato già detto la cosa migliore da fare è correggere il programma. L'istruzione che apre la connessione ha un parametro che consente di impostare il timeout. Se questo viene raggiunto viene sollevata un'eccezione che puoi intercettare e gestire in modo opportuno.
Il problema non è quando tento di aprire la connessione con il socket ma dopo che questa è già stata aperta ed è in atto già uno scambio di informazioni. Se in questa fase la connessione cade per più di un tot di tempo il sistema si blocca.
Per rispondere alla tua domanda poi, cosa c'è che non va con il metodo che hai già adottato?[/QUOTE]
Quale metodo? Quello dei thread?
Ciao
Ma l'applicazione è costituita dal solo jar o c'è un application server a monte ?
Genera dump quando si blocca ?
Io proverei a fare un thread dump del processo java per vedere dove sono bloccati i thread, o eventualmente capire se c'è qualche leak di memoria.
Infine, se l'applicazione si collega a un db, ammesso ci sia un connection pool, andrebbe visto su quest'ultimo se restano sessioni aperte con relativi lock.
Daniels118
10-02-2014, 14:19
Allora vedi qui:
http://docs.oracle.com/javase/6/docs/api/java/net/Socket.html#setSoTimeout%28int%29
Intendevo il metodo con il "kill".
clockover
10-02-2014, 14:28
Ho già pensato di creare un thread che supervisioni il programma che si blocca(che quindi diventerebbe un thread "figlio"), il problema è che girando su Linux, per la gestione di scheduling che ha, potrei creare dei problemi "sincronismo" fra tutti i thread che così creerò.
Questa mi sembra una supercazzola ma comunque...
Come fai ad accorgerti che il processo in esecuzione è "bloccato" per poi utilizzare il comando "kill" (kill è un comando vero e proprio) ?? Hai un tuo metodo? Il processo dice parolacce?
Questa mi sembra una supercazzola ma comunque...
Come fai ad accorgerti che il processo in esecuzione è "bloccato" per poi utilizzare il comando "kill" (kill è un comando vero e proprio) ?? Hai un tuo metodo? Il processo dice parolacce?
No aspetta, il comando "kill" è eseguito dalla shell di linux.
Cmq stiamo deviando dalla mia domanda originale.
Posso bloccare un eseguibile che sta girando su un SO con un altro eseguibile?
clockover
10-02-2014, 14:47
No aspetta, il comando "kill" è eseguito dalla shell di linux.
Cmq stiamo deviando dalla mia domanda originale.
Posso bloccare un eseguibile che sta girando su un SO con un altro eseguibile?
Nel tuo primo post hai detto "parola chiave kill". Kill è molto più di una parola chiave. Con kill puoi mandare qualunque tipo di segnale. Ed è proprio con i segnali che puoi comunicare con i processi in esecuzione sul tuo sistema operativo.
Ora ti chiedo di nuovo: "Come te ne accorgi che il tuo processo in esecuzione non funziona più come dovrebbe?"
Nel tuo primo post hai detto "parola chiave kill". Kill è molto più di una parola chiave. Con kill puoi mandare qualunque tipo di segnale. Ed è proprio con i segnali che puoi comunicare con i processi in esecuzione sul tuo sistema operativo.
Ora ti chiedo di nuovo: "Come te ne accorgi che il tuo processo in esecuzione non funziona più come dovrebbe?"
Perché lui deve scaricare dei dati da un server collegandosi ad esso via internet.
Monitorando con uno sniffer la rete si vede che dopo che la connessione cade e viene ristabilita dopo più di un minuto, non ci sono più richieste da e verso detto server. L'applicazione non manda segnali di alcun tipo nè solleva eccezioni.
clockover
10-02-2014, 15:14
Allora non puoi farci nulla. Bisogna modificare il sorgente. Questo perché un processo esterno non può sapere se il programma in esecuzione è realmente bloccato oppure semplicemente non ha nulla da fare in quel momento. A meno che non abbia un file di journaling che può essere consultato dall'esterno che dice ad esempio "ho cominciato il download", "ho terminato il download ", ecc...
Inviato da una supercazzola ed un Nexus 5 scappellato a sinistra.. con senso unico
Allora non puoi farci nulla. Bisogna modificare il sorgente. Questo perché un processo esterno non può sapere se il programma in esecuzione è realmente bloccato oppure semplicemente non ha nulla da fare in quel momento. A meno che non abbia un file di journaling che può essere consultato dall'esterno che dice ad esempio "ho cominciato il download", "ho terminato il download ", ecc...
Inviato da una supercazzola ed un Nexus 5 scappellato a sinistra.. con senso unico
Capito destra sinistra, se per quando mi si è sbloccato il socket posso bloccarlo da dietro per via risorgimento sempre diritto!!!!:D :D
Daniels118
10-02-2014, 15:21
Cos'è, un indovinello?
Ti ripropongo la mia domanda, cos'ha che non va il kill?
clockover
10-02-2014, 15:22
Vedo che hai quartato. Comunque se vuoi è molto più semplice implementare un file di journaling che far testare la rete al programma. Sono davvero poche righe di codice. A quel punto un semplicissimo script pianificato con crontab e sei a cavallo
Inviato da una supercazzola ed un Nexus 5 scappellato a sinistra.. con senso unico
Vedo che hai quartato. Comunque se vuoi è molto più semplice implementare un file di journaling che far testare la rete al programma. Sono davvero poche righe di codice. A quel punto un semplicissimo script pianificato con crontab e sei a cavallo
Inviato da una supercazzola ed un Nexus 5 scappellato a sinistra.. con senso unico
@ daniels: non sai cos'è la supercazzola? vai su youtube!!! Gran pezzo dis toria cinematografica d'italia
non è che non posso... ma vorrei trovare anche un'altra soluzione...
Ok grazie mille!
Daniels118
10-02-2014, 15:47
Ah certo, non avevo associato :D
I processi si possono terminare anche "programmaticamente" (si può dire?), alcuni linguaggi potrebbero mettere a disposizione delle api portabili, con altri invece devi ricorrere a quelle del sistema operativo. Questo "monitor" vorresti farlo sempre in java?
PS. in ogni mio post ti ripeterò sempre che la retta via è quella di correggere il programma principale.
Ah certo, non avevo associato :D
I processi si possono terminare anche "programmaticamente" (si può dire?), alcuni linguaggi potrebbero mettere a disposizione delle api portabili, con altri invece devi ricorrere a quelle del sistema operativo. Questo "monitor" vorresti farlo sempre in java?
PS. in ogni mio post ti ripeterò sempre che la retta via è quella di correggere il programma principale.
Sono d'accordo con il tuo suggerimento... ma dato che ancora non posso fare il debug sto pensando a tutto!!!
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.