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?
Réponses
Trop de publicités?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.