4 votes

Pourquoi ce processus ne peut-il pas se terminer ?

o

Récemment, j'ai rencontré un problème où mon programme réseau ne pouvait pas se lier à un port car il était déjà utilisé. J'ai ouvert le moniteur d'activité et j'ai réalisé (nommé "serveur") qu'il était déjà en cours d'exécution depuis auparavant, même si j'avais fermé la fenêtre et qu'il était censé être terminé. Quitter ou Forcer à quitter le processus ne font rien. J'ai même redémarré l'ordinateur mais il était toujours là! Cela ne s'était jamais produit avec mon programme auparavant. J'ai même tapé dans le terminal kill 4517 et rien ne s'est passé. Aide?

4voto

Ryan Spears Points 1524

OS X utilise un système de lancement de processus appelé launchd qui consolide les fonctions fournies par les scripts Init, crontab et plus encore dans les systèmes *nix (voir l'article Wikipedia pour un aperçu de haut niveau, et les documents de développeur d'Apple sur les démons et agents launch pour plus de détails). Une des capacités de launchd est de maintenir en vie un processus qu'il a lancé, si cela est défini dans son fichier de configuration - dans ce cas, le processus se relancera à chaque fois qu'il sera terminé. Votre problème avec un processus apparemment persistant à travers les redémarrages et les terminaisons manuelles ressemble beaucoup à un cas de processus initié par launchd avec une clé keepAlive.

Les fichiers de configuration de launchd sont au format plist et se trouvent dans

  • ~/Library/LaunchAgents - agents pour le compte utilisateur actuel uniquement
  • /Library/LaunchAgents et /Library/LaunchDaemons - agents et démons pour tous les comptes utilisateurs
  • /System/Library/LaunchAgents et /System/Library/LaunchDaemons - agents et démons de niveau système

et sont généralement nommés en notation de domaine inverse (tld.domain.process.plist). Selon que le compte utilisateur de server vous appartient ou non (je ne peux pas dire, car vous l'avez masqué), vous devriez chercher dans l'un des deux premiers emplacements ci-dessus pour un plist probable (si vous avez installé Xcode, vous pouvez les visualiser rapidement avec QuickLook). Si trouvé, votre server est effectivement contrôlé par launchd. La procédure correcte pour l'arrêter est de le supprimer de la liste de processus de launchd à travers

launchctl unload 

qui déchargera et arrêtera le processus (notez que vous omettez le suffixe plist).

Il existe également une interface graphique pour gérer les fichiers launchd, Lingon de Peter Borg (assurez-vous d'obtenir "Lingon", pas "Lingon 3", qui est une version simplifiée adaptée à un usage basique), qui pourrait être plus pratique que de fouiller manuellement dans les emplacements des fichiers.

2voto

dhempler Points 1566

Essayez ceci.

    sudo kill -9 4517

Où 4517 est le PID du processus.

Si le processus revient avec un nouveau PID, quelque chose l'a relancé. Voir la réponse de kopischke pour savoir comment gérer cela.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X