2010-06-10 4 views
7

Mon domaine principal est .Net mais récemment j'ai quelque chose à voir avec Java. Je dois créer un utilitaire shell en Java qui pourrait fonctionner en arrière-plan en lisant quelques enregistrements de base de données après une durée spécifiée et faire un traitement ultérieur. C'est une sorte de planificateur. Maintenant, j'ai quelques préoccupations:Comment arrêter l'exécution du programme Java à partir de la ligne de commande?

Comment faire ce travail en tant que service. Je veux l'exécuter à travers un script shell et l'utilitaire devrait commencer à fonctionner. Bien sûr, le contrôle devrait revenir au script appelant. Deuxièmement, éventuellement, je souhaite arrêter ce processus de fonctionner. Comment y parvenir? Je comprends que ce sont des questions de base mais je n'ai aucune idée par où commencer et quelles sont les meilleures options pour moi.

Toute aide/conseil s'il vous plaît?

+0

@danben Bien sûr, va faire ... Merci – Aakash

Répondre

2

Je voudrais aller exécuter le programme en utilisant un planificateur ou un service. Toutefois, si vous souhaitez utiliser un fichier de chauve-souris et faire un programme, je l'ai décrit une approche possible ci-dessous:

Dans votre programme Java, vous pouvez obtenir le PID programme, puis l'écrire dans un fichier:

public static void writePID(String fileLocation) throws IOException 
{ 
    // Use the engine management bean in java to find out the pid 
    // and to write to a file 
    if (fileLocation.length() == 0) 
    { 
     fileLocation = DEFAULT_PID_FILE; 
    }  
    String pid = ManagementFactory.getRuntimeMXBean().getName(); 
    if (pid.indexOf("@") != -1) 
    { 
     pid = pid.substring(0, pid.indexOf("@")); 
    }            
    BufferedWriter writer = new BufferedWriter(new FileWriter(fileLocation)); 
    writer.write(pid); 
    writer.newLine(); 
    writer.flush(); 
    writer.close();      
} 

Vous pouvez ensuite écrire un fichier .bat stop qui supprimera le programme en cours d'exécution dans Windows. Vous pouvez faire quelque chose comme:

setlocal 
IF EXIST app.pid FOR /F %%i in ('type app.pid') do TASKKILL /F /PID %%i 
IF EXIST app.pid DEL app.pid 
endlocal 

Bien sûr, app.pid est le fichier écrit par la méthode Java ci-dessus. Je ne sais pas comment vous pourriez écrire un script qui lancerait un programme java et rétablirait le contrôle sur la terminaison. Je serais intéressé de voir si quelqu'un a une solution pour cela.

+0

Est-ce que cela signifie que je pourrais avoir à écrire une autre application Java qui lira ce fichier et tuer le processus en cours d'exécution? – Aakash

+0

Non, le fichier .bat est le bit qui tue votre processus. C'est un peu de VBScript qui tue l'application en cours d'exécution. SI EXIST app.pid POUR/F %% i dans ('type app.pid') do TASKKILL/F/PID %% i Si vous exécutez ceci sur * nix, vous pouvez écrire un script shell qui fait la même chose. – Luhar

1
ps ux 

voir pid

kill pid 

Ou vous feriez mieux de donner un script d'arrêt qui signale l'application, qui ne System.exit(0)

+0

tant qu'il ne fait pas quelque chose comme les transactions de base de données, tuer le pid est très bien. S'il a des transactions de base de données, peut-être besoin de le faire un peu plus fancilement. – bwawok

+0

@bwawok Vous avez raison. Je fais un travail de base de données là-bas. – Aakash

1

Vous ne précisaient pas la plate-forme. Si sous Windows, vous devriez envisager de vous intégrer au Service Control pour créer un service Windows. http://en.wikipedia.org/wiki/Windows_service. Une fois que vous avez implémenté les hooks de service, il est possible de démarrer et d'arrêter le service via l'interface graphique de contrôle de service ou en utilisant la syntaxe net stop MyService à partir de la ligne de commande.

+0

Je veux faire cela sur la plate-forme Unix. Merci – Aakash

2

Je suppose que vous jouez votre programme Java avec une boîte Linux/Unix. Pour exécuter votre application en tant que démon, vous pouvez essayer

nohup java YourJavaClass & 

Pour arrêter votre application, vous pouvez:

kill [psIdofYourApplication] 

ou

fg [your application job Id] 
Ctrl-C 

Si vous voulez faire un peu de post-traitement après que l'application ait reçu le signal 'kill/stop'.Vérifions addShutdownHook(Thread hook)

Ou sun.misc.SignalHandler

0

Si je comprends bien, vous voulez quelque chose comme ceci:

if (System.in.avaliable() > 0) { 
    in = new BufferedReader(new InputStreamReader(System.in); 
    String InLine = in.readLine(); 
    ... 
} 

Ai-je raison?

Questions connexes