2013-08-29 1 views
-1

J'utilise perl version 5.8.4. Je travaille avec un programme appelé JMP. Avant d'ouvrir le programme, je veux utiliser perl pour vérifier si un processus du programme est déjà en cours d'exécution. Si c'est en cours, je veux le fermer.Vérifier si le processus est en cours d'exécution et le tuer

+0

voir cela pourrait aider u http://stackoverflow.com/questions/11273636/check-if-program-is-running -and-run-it-if-not-in-perl – Developer

+0

$ existe = tuer 0, 1525; print "Le processus s'exécute \ n" if ($ existe); de ce que vous pouvez également vérifier – Developer

+0

qu'est-ce que cela signifie 0,1525? comment cela fait-il référence au processus spécifique? – Vera

Répondre

1

REWORK: (Idk comment je reçois ici, je viens de perdre)

Cela ne fonctionne que dans les fenêtres cause est une exécution shell (Taskkill).

system('taskkill /F /IM ImageName.exe >nul 2>&1'); 

double possible de:

How can I kill a program that might not exist from Perl on Win32?

perl> Documentation du système:

http://perldoc.perl.org/functions/system.html

documentation Taskkill:

http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/taskkill.mspx?mfr=true

A propos de la redirection de syntaxe (Basé dans un awnser de How can I kill a program that might not exist from Perl on Win32?):

http://ss64.com/nt/syntax-redirection.html

1

Vous devez simplement ajouter ceci:

use autodie 'system'; 
system('killall', '-q', 'JMP'); 

ou

use autodie 'system'; 
system('pkill', 'JMP'); 

Si vous voulez gérer l'erreur vous vérifier au lieu d'utiliser autodie, il ressemblerait

die "Can't launch killall: $!\n"     if $? < 0; 
die "killall killed by signal ".($? & 0x7F)."\n" if $? & 0x7F; 
die "killall exited with error ".($? >> 8)."\n" if $? >> 8; 
+2

Vous voudrez peut-être ajouter une note sur la façon dont vous pouvez vérifier le code de sortie pour faire d'autres choses. – Ryan

+0

Il s'avère que OP utilise Windows de toute façon et négligé de nous le dire. : D –

+0

J'ai remarqué, mais il a déjà une solution. – ikegami

1

En utilisant les commentaires utiles des autres sur cette question, réécrire la réponse pour qu'elle soit plus adaptée à la question à portée de main.

Il vérifie si le processus est en cours d'exécution, vous donnant la possibilité de faire plus de tuer (sortie d'impression à la console, tuer ses sous-processus, si nécessaire, etc.), court killallque si le programme est en cours d'exécution, puis commence jmp.

#!/usr/bin/perl 
use warnings; 
use strict; 

# Read all script-name processes 
open PROS, "ps -ef| grep jmp |"; 

# Iterate the processes 
while ($line = <PROS>){ 
    # If we match the process, kill all instances 
    unless ($line =~ m/grep/){ 
     system 'killall jmp'; 
     last; 
    } 
} 

# Finished with the processes 
close PROS; 

# Start jmp 
exec 'nohup /path/to/jmp &'; 

Si vous utilisez Windows, vous aurez envie de regarder dans taskkill au lieu de killall.

+0

Je reçois une erreur: 'ps' n'est pas reconnu comme une commande interne ou externe, un fichier exécutable ou un fichier séquentiel. – Vera

+0

@Vera Donc, vous utilisez Windows? Aurait été utile de mettre dans la question. –

Questions connexes