Exécution du script lors de la connexion mac [fermé]

280

Je me demande si quelqu'un peut m'aider à exécuter un fichier .sh lorsque je me connecte à mon compte sur mon ordinateur. J'utilise Mac OS X 10.6.7.

J'ai un fichier "Example.sh" que je veux exécuter lorsque je me connecte à mon ordinateur. Je n'ai aucun problème à l'exécuter lorsque je suis déjà connecté, mais je veux que cela s'exécute automatiquement.

Les gens disent de l'ajouter au fichier shell de connexion, mais je ne sais pas où c'est. Un peu d'aide s'il vous plaît.

MZimmerman6
la source
3
Ce n'est pas hors sujet ... J'en avais besoin pour démarrer mon démon Emacs;) BTW la meilleure réponse est à mon humble avis l'application Lingon X.
HappyFace
1
Je me fiche que ce soit hors sujet. C'est la meilleure réponse que j'ai trouvée sur Internet et elle mérite le respect. Je l'ai ignoré pour les autres la première fois que je cherchais une solution et c'était une grosse erreur!
Sethmr

Réponses:

380

Suivez ceci:

  • début Automator.app
  • sélectionner Application
  • cliquez Show librarydans la barre d'outils (si masqué)
  • ajouter Run shell script(à partir du Actions/Utilities)
  • copiez et collez votre script dans la fenêtre
  • Essaye-le
  • enregistrer quelque part (par exemple, vous pouvez créer un Applicationsdossier dans votre HOME, vous obtiendrez un your_name.app)

  • allez à System Preferences-> Accounts->Login items

  • ajouter cette appli
  • test & terminé;)

ÉDITER:

J'ai récemment obtenu un badge "Bonne réponse" pour cette réponse. Bien que ma solution soit simple et fonctionne, la manière la plus propre d'exécuter n'importe quel programme ou script shell au moment de la connexion est décrite dans la réponse de @ trisweb , sauf si vous voulez l'interactivité .

Avec la solution d'automatisation, vous pouvez faire des choses comme la suivante: application de connexion de capture d'écran d'automate

donc, demander à exécuter un script ou quitter l'application, demander des mots de passe, exécuter d'autres workflows d'automate au moment de la connexion, exécuter conditionnellement des applications au moment de la connexion et ainsi de suite ...

jm666
la source
2
@GregMiernicki LOL, bonjour ...;) Il y a près d'un an, j'ai ajouté un EDIT à ma réponse, où je le disais aussi. Mais, c'est un peu plus simple pour les utilisateurs moyens, car la création de fichiers XML (plist) n'est pas très conviviale pour de nombreux utilisateurs. Quoi qu'il en soit - merci pour un commentaire. ;)
jm666
4
@GregMiernicki et n'oubliez pas, avec la solution Automator, vous pouvez créer des scripts de connexion INTERACTIFS - par exemple un script qui vous demandera une entrée (par exemple un mot de passe supplémentaire ou quelque chose du genre). Le monde n'est pas seulement noir ou blanc - au moins, c'est comme un zèbre ... :) :)
jm666
2
@Cupidvogel L'exécution d'un démon au moment de la connexion est exactement le travail de la solution launchd - voir la réponse de trisweb. Si vous pouvez gérer un démon python, vous êtes sûr de pouvoir gérer un fichier de configuration plist où vous pouvez gérer tous les aspects des redémarrages et ainsi de suite ...
jm666
3
Bravo pour avoir signalé l'autre réponse comme étant la plus propre. Cela devrait obtenir un bon badge de citoyenneté :).
studgeek
2
Réponse incroyable. Exportez PATH = / usr / local / bin: $ PATH, au début du script, si vous souhaitez exécuter des commandes telles que "mise à jour globale du compositeur" au démarrage du système.
Leonardo
378

tl; dr: utiliser le lanceur de processus natif de Mac OS X et directeur, launchd.

Pour ce faire, créez un launchctldémon. Vous aurez un contrôle total sur tous les aspects du script. Vous pouvez exécuter une fois ou rester en vie en tant que démon. Dans la plupart des cas, c'est la voie à suivre.

  1. Créez un .plistfichier selon les instructions des documents Apple Dev ici ou plus en détail ci-dessous.
  2. Placer dans ~/Library/LaunchAgents
  3. Connectez-vous (ou exécutez manuellement via launchctl load [filename.plist])

Pour en savoir plus launchd, l'article de wikipedia est assez bon et décrit le système et ses avantages par rapport à d'autres systèmes plus anciens.


Voici le fichier plist spécifique pour exécuter un script lors de la connexion .

Mis à jour 2017/09/25 pour OSX El Capitan et plus récent (crédit à José Messias Jr ):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
   <key>Label</key>
   <string>com.user.loginscript</string>
   <key>ProgramArguments</key>
   <array><string>/path/to/executable/script.sh</string></array>
   <key>RunAtLoad</key>
   <true/>
</dict>
</plist>

Remplacez la <string>clé de programme par la commande souhaitée (notez que tout script référencé par cette commande doit être exécutable: chmod a+x /path/to/executable/script.shpour garantir qu'il s'adresse à tous les utilisateurs).

Enregistrer sous ~/Library/LaunchAgents/com.user.loginscript.plist

Exécuter launchctl load ~/Library/LaunchAgents/com.user.loginscript.plistet se déconnecter / se connecter pour tester (ou pour tester directement, exécuter launchctl start com.user.loginscript)

Queue /var/log/system.logpour les messages d'erreur.

La clé est qu'il s'agit d'une entrée launchd spécifique à l'utilisateur, elle sera donc exécutée lors de la connexion pour l'utilisateur donné. Les démons de lancement spécifiques au système (placés dans /Library/LaunchDaemons) sont exécutés au démarrage.

Si vous souhaitez qu'un script s'exécute à la connexion pour tous les utilisateurs, je pense que LoginHook est votre seule option, et c'est probablement la raison pour laquelle il existe.

trisweb
la source
4
Oui. FWIW J'ai trouvé ce blog sur la même technique utile: developernotes.com/archive/2011/04/06/169.aspx
Daniel James
8
Vous négligez de mentionner ce qui est douteux au sujet des actions d'Automator et pourquoi elles ne sont «pas recommandées».
Mike Campbell
4
Voici un bon aperçu des actions sur les dossiers par rapport à launchctl: apple.stackexchange.com/a/63731/38290 - Et un autre sur l'une des limitations de LoginHook (un seul script autorisé) - superuser.com/a/377401 . Ce n'est pas vraiment une méthode douteuse ou médiocre, mais elle launchctlest tout simplement bien meilleure dans la plupart des cas et vous donne plus de contrôle sur tous les aspects possibles de l'exécution de votre script. C'est plus dans le sens de "pourquoi utiliser une méthode moins performante lorsque launchd existe?" (Notez que j'ai modifié la première phrase pour indiquer que personnellement je ne les recommande pas dans cette situation).
trisweb
3
Vous vous demandez comment vous allez créer LaunchDaemon plist qu'est-ce qui s'exécutera à chaque fois que l'utilisateur se connecte? . Donc, pas au démarrage du système, mais à chaque fois que l'utilisateur se connecte (essayez avec le cycle de déconnexion-connexion). Pouvez-vous s'il vous plaît montrer exactement (pas seulement bla-bla) comment implémenter la solution d'automate ci-dessus (par vous mal) avec launchctl?
cajwine du
9
Les fichiers Plist dans / Library / LaunchAgents / sont exécutés à la connexion avec l'ID de l'utilisateur connecté. Les fichiers Plist dans / Library / LaunchDaemons / sont exécutés au démarrage en tant que root (l'ID peut être modifié avec la clé utilisateur ).
bain
42
  1. Créez votre script shell comme login.shdans votre dossier $ HOME.

  2. Collez le script d'une ligne suivant dans l'éditeur de script:

    faire le script shell "$ HOME / login.sh"

  3. Enregistrez-le ensuite en tant qu'application.

  4. Enfin, ajoutez l'application à vos éléments de connexion.

Si vous souhaitez rendre la sortie du script visuelle, vous pouvez permuter l'étape 2 pour cela:

tell application "Terminal"
  activate
  do script "$HOME/login.sh"
end tell

Si plusieurs commandes sont nécessaires, quelque chose comme ceci peut être utilisé:

tell application "Terminal"
  activate
  do script "cd $HOME"
  do script "./login.sh" in window 1
end tell
anubhava
la source
1
J'ai lié celui-ci, la seule chose qui manque un programme d'installation en ligne de commande;)
sorin
1
Belle solution. Comment masquer la fenêtre "login"? J'ai essayé de cocher les éléments de connexion.
xgdgsc
1
@xgdgsc: Aller à Go to System Preferences -> Accounts -> Login itemset cocher la case pour cette application.
anubhava
1
@anubhava Comme je l'ai dit, j'ai déjà coché la case masquer pour cette application de connexion. Mais il apparaît toujours et doit être forcé de quitter lors de l'arrêt de l'ordinateur.
xgdgsc
2
@xgdgsc: Oh ok, avez-vous vérifié le ~/Library/LaunchAgentsdossier?
anubhava