Question

J'ai un nom de processus et j'ai envoyer un signal de kill() à ce processus mais j'ai besoin de son PID pour appeler kill(). Je voudrais seulement utiliser:

popen("pidof process_name");

comme la dernière chose. Y at-il d'autre moyen de savoir PID du processus? Une façon que je pouvais penser est d'envoyer une demande de prise à ce processus et demander à son PID.

L'autre façon est un peu trop compliqué pour un code simple que je vous écris: pour faire ce que code source de commande pidof est en train de faire (il utilise un find_pid_by_name() d'appel de fonction, mais qui est de faire beaucoup de choses).

Si aucune solution simple est possible, je l'ai à faire ceci:

system("pkill <process_name>");

et vérifier son code de retour. Mais sera disponible pkill sûr sur toutes les machines Linux?

Était-ce utile?

La solution

Vous avez mentionné que vous utilisiez linux. Il n'est pas la solution la plus propre, mais vous pouvez passer par chaque entrée dans / proc et vérifier le nom du processus cmdline contre ce que vous recherchez.

Autres conseils

Utilisez sysctl - voir ici

Procfs lit sont très pas cher, beaucoup de gens pensent à itérer / proc comme ils itérer /, il est vraiment pas le cas du tout.

Gardez un peu de temps en sautant une entrée qui est en 1000, il n'y a pas de sens dans l'examen des threads du noyau. Donc, en gros .. après opendir (), si StrToInt () pense que l'entrée est un entier, et que int est supérieur ou égal à 1000, il suffit de lire / proc /% d / stat.

Essayez d'éviter l'envie de résoudre simplement le lien « exe », comme cela ne va pas vous dire l'état du processus qui va recevoir le signal. Par exemple, si la cible est dans un état « D » (sommeil de disque), vous voulez savoir que le signal ne sera pas livré immédiatement, ou peut-être jamais, si l'état D est pérenne.

Sur la plupart des systèmes, il y aura 70 -. 120 processus pour examiner et vous trouverez souvent votre chemin cible avant d'atteindre la fin

Vous mentionnez, « Une façon que je pouvais penser est d'envoyer une demande de prise à ce processus et demander à son PID. » Il semble que le processus que vous essayez de tuer est un programme que vous avez écrit.

Si tel est le cas, la chose canoniques à faire est de stocker le pid dans un fichier (généralement sous / var / run, si vous y avez accès) alors que le programme est en cours d'exécution, et supprimez le fichier lorsque les sorties du programme . De cette façon, détecter si oui ou non l'exécution du programme est aussi simple que

if kill -0 $(cat /var/run/myprog.pid 2>/dev/null) 2>/dev/null; then
    echo Running!
else
    rm -f /var/run/myprog.pid
    echo "Not running."
end

Une étude attentive de toutes les implications du code ci-dessus vous apprendra probablement beaucoup sur la façon dont fonctionnent les fichiers PID. Ou vous pouvez simplement demander une explication plus détaillée.

Cela semble fonctionner très bien pour moi.

Vous pouvez donner le chemin complet du processus mais, de peur que vous tuez un processus qui a un nom similaire.

Le principal avantage est que vous pouvez spécifier le signal que vous souhaitez envoyer.

system("killall -s 9 process_name");

pourquoi ne pas utiliser fcntl avec F_GETOWN?

Pour compléter les réponses de @GregRogers, il vous suffit de vérifier la mise en œuvre de pidof

comme vous pouvez le voir recherche uniquement sur le répertoire / proc.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top