Comment tuer un processus de windows exécutant plus de 30 minutes
En gros, j'ai besoin de réaliser deux choses,
- Trouver tous "firefox.exe" les processus en cours d'exécution sur un serveur windows
- Tuer ceux qui ont été en cours d'exécution de plus de 30 minutes
J'ai de pièces et de morceaux, mais vous ne savez pas comment les intégrer pour qu'il fonctionne comme un service windows.
Ce que j'ai à ce jour -
1) pour trouver lancement de firefox processus
wmic process get name,creationdate, processid | findstr firefox
2) Façon de tuer un processus, sur la base PID
taskkill /PID 827
Quoi d'autre est à gauche?
- Calculer basée sur
creationdate
, quiPID
est en cours d'exécution de plus de 30 minutes - Utiliser le
taskkill
commande séquentielle de tuer tous les PIDs qui correspondent aux critères ci-dessus - ensemble, c'est un service (ce que je peux probablement trouver d')
OriginalL'auteur Amey | 2013-01-17
Vous devez vous connecter pour publier un commentaire.
Il est facile de penser, "Vous ne pouvez pas le faire .chauve-souris". Je sais que cela a été ma première réaction. Le problème est que vous avez besoin de la date de manipulation qui n'est pas directement pris en charge et est non-trivial. Mais alors Ritchie-Laurent vient à la rescousse, après avoir fait tout le travail de rédaction de la nécessaire les fonctions de date.
WMI
Process
classe fournitCreationDate
au format UTC.Win32_OperatingSystem
LocalDateTime
nous donne l'heure courante au format UTC. Nous avons besoin de soustraire la durée de vie maximale (30 minutes dans votre cas) à partir de LocalDataTime pour obtenir le CutOffTime. Ensuite, nous pouvons utiliser pour filtrer lesProcess
, et enfincall terminate
(au lieu detaskkill
). Plutôt que defindstr
, j'utilise WMIwhere
filtre (qui est beaucoup plus rapide).Le code suivant semble fonctionner. Comme c'est TUER des TÂCHES, testez-le pour vous-même.
Remarque:
if "%%p" GEQ "0"
est utilisé pour filtrer le 'vide' de ligne à la fin des résultats de wmic qui n'est pas vide mais contient un caractère de saut de ligne. Comme nous nous attendons à un certain nombre, cela semblait un moyen simple et efficace de test (bien que peut-être il ya une meilleure façon de gérer cela).À L'Aide De Powershell
La question initiale a été marqué avec "batch file" alors j'ai laissé les Fenêtres de batte de répondre en premier. Mais je voulais parler de meurtre d'un nommé processus qui a été en cours d'exécution de plus de 30 minutes est trivial à faire avec Powershell:
Encore une fois c'est TUER des TÂCHES donc soyez prudent. Si vous n'êtes pas familier avec Powershell en voici le détail de l'un liner:
Get-Process
applet de commande pour obtenir le processus en cours d'exécution sur l'ordinateur local. Ici, le nom du processus,firefox
est passé. Si nécessaire, une liste de noms peut être passée, et les caractères génériques peuvent être utilisés.Get-Process
sont redirigés versWhere
à filtrer sur le StartTime de la propriété. LeGet-Date
applet de commande est utilisé pour obtenir la date et l'heure actuelle comme unDateTime
type. Le AddMinutes méthode est appelée pour ajouter -30 minutes, en retournant uneDateTime
qui représente il y a 30 minutes. Le-lt
opérateur (techniquement, dans ce contexte, c'est un paramètre de commutateur), précise le Moins que l'exploitation.Where
sont redirigés vers l'Stop-Process
applet de commande. Le-Force
paramètre est utilisé pour prévenir l'invite de confirmation.Ci-dessus, j'ai utilisé la procédure simplifiée de
Where
syntaxe introduite dans Powershell 3. Si vous avez besoin de Powershell 2 compatibilité (qui est la dernière version qui fonctionne sous Windows XP), puis cette syntaxe est requise:Ici les accolades joindre un ScriptBlock.
$_
est utilisé explicitement référence à l'objet courant.J'ai testé cela avec notepad.exe la tuer la cible. Dans mes tests, plusieurs processus ont été tués en cas de besoin. Cependant, même avant d'avoir lu votre commentaire, j'ai réalisé que je pouvais juste avoir
wmic
call terminate
. J'ai mis à jour le code, en commentant les vieilles lignes.lectures supplémentaires:
set /?
,for /?
,setlocal /?
,wmic /?
. Bonne chance.merci pour la petite info, il fonctionne à merveille maintenant. Merci.
OriginalL'auteur jimhark
Je crois que vous êtes en train de faire une sorte de test d'automatisation, et il ya beaucoup de la pendaison de firefox, c'est dans le but de tuer TOUS ceux qui courent plus de la moitié et pour l'heure, n':
C'est vraiment ce que nous faisons.
OriginalL'auteur TEH EMPRAH