0 votes

Comment empêcher l'exécution d'un processus / démon sur MacOS ?

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 ?

2voto

Ted Wrigley Points 725

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
  1. Copier script dans une fenêtre de l'éditeur script, en faisant les ajustements appropriés comme indiqué dans les commentaires :
  2. Choisissez "Enregistrer" dans le menu Fichier.
  3. Changez la liste déroulante "Format de fichier" en "Application".
  4. Cliquez sur la case à cocher qui dit "Rester ouvert après l'exécution du gestionnaire".
  5. Enregistrez-le sous le nom de votre choix, là où cela vous convient.
  6. 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é.
  7. 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.

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