J'ai installé une application appelée "ShadowsocksX-NG" et dès que je redémarre mon ordinateur, /Users/admin/Library/Application Support/ShadowsocksX-NG/ss-local -c ss-local-config.json
sera exécuté en arrière-plan. Ce n'est pas souhaitable. De toute évidence, ce processus n'est pas dans mon Login Items
. Où et comment MacOS gère-t-il les démons ?
Réponse
Trop de publicités?D'abord, Shadowsocks a un site GitHub actif où vous pouvez poser cette question directement aux personnes travaillant sur le projet. Il est probable qu'ils en sachent beaucoup plus que quiconque ici.
Ceci étant dit, Shadowsocks (d'après notre discussion, ci-dessus) crée ces fichiers plist launchd de manière programmatique, il n'y a donc pas de moyen facile - à moins d'aller sur GitHub et de devenir un contributeur du projet - de l'empêcher de le faire. Je suppose que vous voulez que ss-local soit lancé lorsque Shadowsocks est en cours d'exécution, mais que vous ne voulez pas qu'il soit lancé le reste du temps. Vous pouvez le faire manuellement dans le terminal en utilisant la commande launchctl
utilitaire. Vous devez d'abord obtenir le Label
de la tâche launchd, donc ouvrez les fichiers plist que Shadowsocks crée dans un éditeur de texte et cherchez quelque chose comme ceci :
<key>Label</key>
<string>com.Shadowsocks.something.whatever</string>
Le bit entre le <string>
tags est l'étiquette du travail de launchd, donc si vous exécutez la commande suivante dans le terminal (une fois pour chaque fichier plist) :
launchctl remove com.Shadowsocks.something.whatever
Cela supprimera le travail de launchd, ce qui arrêtera tous les processus que ces travaux sont en cours d'exécution. Je suppose que Shadowsocks relancera les travaux lorsque vous le relancerez, mais si ce n'est pas le cas, vous pouvez aussi le faire manuellement en utilisant :
launchctl load ~/Library/LaunchAgents/<filename>.plist
Vous pourriez script cela de plusieurs façons différentes, je pense, mais je ne sais pas quels sont les langages de script avec lesquels vous êtes familier (s'il y en a), et il serait préférable d'aller sur GitHub et de demander une solution de développeur de toute façon.
EDIT :
Par commentaires... OSX avait l'habitude d'avoir un système pour créer des hooks de déconnexion à travers le Window Server, mais cela a été déprécié en 10.4, et je ne sais pas si cela fonctionne encore. Donc à la place, je vais vous dire comment créer une application script en arrière-plan qui devrait faire ce que vous voulez.
Voici le script, suivez les instructions ci-dessous :
(*
add the job labels for the plist files Shadowsocks creates to the following
list. This assumes that they follow the normal convention where the file name
is the job label with '.plist' attached. If not you may need to adjust things
in the cleanUp() handler
*)
property labelList : {"joblabel1", "joblabel2"}
global isDirty
on run
set isDirty to false
end run
on reopen
display alert "Do you want to quit?" buttons {"Yes", "No"}
if button returned of the result is "Yes" then quit
end reopen
on idle
tell application "System Events"
-- I'm guessing this is the process name as it appears in system events.
-- You should double check
if exists process "Shadowsocks-NG" then
-- if SS is running, mark the condition as dirty
set isDirty to true
else
-- if SS is not running, and isDirty is set, clean up
if isDirty is true then
my cleanUp()
set isDirty to false
end if
end if
end tell
-- have the idle loop run every 15 minutes.
return 15*minutes
end idle
on quit
(*
when this app quits (which it should only do at logout, unless you quit it
manually), clean up
*)
if isDirty is true then
my cleanUp()
end if
continue quit
end quit
on cleanUp()
-- remove launchd jobs, if loaded
repeat with this_label in labelList
try
do shell script "launchctl remove " & this_label
end try
end repeat
-- delete launch agent plist files
tell application "System Events"
set launchagents_folder_path to folder "LaunchAgents" of library folder of user domain
try
repeat with this_label in labelList
delete (first file of launchagents_folder_path whose name is this_label & ".plist")
end repeat
end try
end tell
end cleanUp
- Copier script dans une fenêtre de l'éditeur script, en faisant les ajustements appropriés comme indiqué dans les commentaires :
- Choisissez "Enregistrer" dans le menu Fichier.
- Changez la liste déroulante "Format de fichier" en "Application".
- Cliquez sur la case à cocher qui dit "Rester ouvert après l'exécution du gestionnaire".
- Enregistrez-le sous le nom de votre choix, là où cela vous convient.
- Allez dans Préférences système Sécurité et confidentialité Accessibilité et ajoutez cette application à la liste des applications autorisées à contrôler votre ordinateur à l'aide de l'accessibilité.
- Ouvrez les Préférences Système et ajoutez cet élément à votre liste d'éléments de connexion pour qu'il s'exécute automatiquement.
En supposant que les noms des tâches launchd et le nom du processus de Shadowsocks sont corrects, cette applet attendra que Shadowsocks s'arrête, et dès que Shadowsocks s'arrêtera, elle supprimera les tâches launchd (en arrêtant les processus qu'elles exécutent) et effacera les fichiers plist de l'agent de lancement. Elle fera la même chose lorsqu'elle quittera, à la déconnexion, au redémarrage ou à l'arrêt.
J'ai fixé le temps d'inactivité à 15 minutes, ce qui semble raisonnable (en moyenne, ss-local ne fonctionne que 7,5 minutes après que vous ayez quitté Shadowsocks).
Une fois que vous êtes sûr qu'elle fonctionne comme vous le souhaitez, vous pouvez la transformer en une véritable application d'arrière-plan. Quittez l'application et ouvrez son fichier info.plist - cliquez avec le bouton droit de la souris sur l'application et choisissez "Show Package Contents" ; info.plist se trouvera dans le dossier "contents" - et ajoutez la paire clé-valeur suivante (en faisant attention à ne pas perturber les autres paires clé-valeur) :
<key>LSUIElement</key>
<true/>
Cela empêche l'application de devenir visible (pas d'icône de dock, et elle ne devient jamais la plus visible ou ne prend pas le contrôle du menu). Elle peut toujours afficher des alertes (utiles pour le débogage des erreurs) mais c'est tout. Vous pouvez la quitter manuellement en double-cliquant à nouveau sur l'icône ; c'est ce que fait l'option reopen
Le gestionnaire est là pour ça.