Exécuter la commande au démarrage / à la connexion (Mac OS X)

53

Je me demandais dans quel fichier je devrais placer cette commande bash afin qu'elle soit exécutée au démarrage.

# Start the MongoDB server
/Applications/MongoDB/bin/mongod --dbpath /usr/local/mongo/data --fork --logpath /usr/local/mongo/log

Je suis déjà récurer le net et je pense qu'il est entre ~/.bashrc, ~/profile, /etc/bashrc, /etc/profileou ~/.bash_profile. Bien que j'ai essayé ces derniers et qu'ils semblent fonctionner au démarrage du terminal et non au démarrage de Mac . Est-ce qu'il me manque un fichier?

Wolfy87
la source

Réponses:

33

Officiellement aucun de ceux-ci. Le moyen suggéré par Apple est d'utiliser launchd . Guis pour mettre cela en place incluent lingon et Launch Control

En ce qui concerne les fichiers que vous mentionnez dans le répertoire de base ~ / .bashrc, ~ / profile, ~ / .bash_profile ne sont démarrés que lorsque vous vous connectez via un terminal. Ceux de / etc sont exécutés par le shell, en commençant par tous les utilisateurs avant ceux du répertoire de base, mais uniquement lorsqu'un utilisateur est connecté. Bash manual

Le script de démarrage Unix impliquait / etc / rc * mais pour OSX, utilisez simplement le truc launchd

utilisateur151019
la source
1
Donc, si ma commande est insérée dans l'un des fichiers, /etcelle devrait être lancée au démarrage? Est-ce que cela importe dans quoi il se trouve?
Wolfy87
1
/etc/bashrcet ainsi de suite sont exécutés lorsque vous démarrez un shell, juste comme ~/.bashrc- c'est juste que le précédent sera exécuté à chaque fois qu'un utilisateur démarrera un shell, plutôt que simplement votre utilisateur.
Scott
@Scott est correct, j'ai corrigé ma réponse
user151019
4
D'accord, mais je ne sais pas comment utiliser launchd. J'ai essayé de créer un fichier plist pour mon programme, mais je ne sais pas comment l'exécuter ni comment le lancer au démarrage.
Wolfy87
1
Le lien @Mark vers "launchd" est rompu :(
Artem
58

Pour exécuter une commande au démarrage sous OS X, vous devez utiliser launchd.

Si vous ne souhaitez pas utiliser Lingon , vous devez créer une launchdliste de propriétés. Il s’agit d’un fichier XML. Vous pouvez donc le faire avec votre éditeur de texte favori ou utiliser l’éditeur de liste de propriétés installé avec les outils de développement Mac OS X. Créez ce qui suit:

<?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>some.meaningful.name</string> <!-- org.mongodb.mongodb perhaps? -->

    <key>OnDemand</key>
    <false/>

    <key>UserName</key>
    <string>anAppropriateUser</string>

    <key>GroupName</key>
    <string>anAppropriateGroup</string>

    <key>ProgramArguments</key>
    <array>
            <string>/Applications/MongoDB/bin/mongod</string>
            <string>--dbpath</string>
            <string>/usr/local/mongo/data</string>
            <string>--fork</string>
            <string>--logpath</string>
            <string>/usr/local/mongo/log</string>
    </array>
</dict>
</plist>

Enregistrez ceci dans /Library/LaunchAgents/some.meaningful.name.plist(vous aurez besoin d’un compte administrateur et / ou sudo), puis ouvrez un terminal et faites:

sudo launchctl load /Library/LaunchAgents/some.meaningful.name.plist

Cela obligera launchd à charger l'élément, ce qui entraînera le démarrage de MongoDB au démarrage. En bonus, launchdle surveillera et, s'il quitte pour une raison quelconque, il sera redémarré. Pour supprimer l'élément, il suffit de remplacer load dans la commande ci-dessus par unload.

Scott
la source
1
Cette page ( developer.apple.com/library/mac/documentation/Darwin/Reference/… ) répertorie beaucoup de choses que quelque chose lancée par launchd ne devrait pas faire. Si je veux exécuter une commande arbitraire au démarrage, je n'ai peut-être pas le contrôle et la commande peut finir par faire ces choses. De plus, je ne souhaite peut-être pas que launchd redémarre et que l'élément s'arrête car il s'agit d'un élément unique ou gère sa relance par lui-même. Que dois-je faire dans ces cas?
Michael
@ Scott, merci. C'est la réponse la plus utile que j'ai trouvée sur Internet.
Dimitriy
5
Cela tentera d'exécuter l'application toutes les 10 secondes, ce qui fonctionne bien pour les services qui ne meurent pas. S'il s'agit d'un script qui s'exécute une fois ponctuellement (dans mon cas, la messagerie une fois relâchée au redémarrage) s'ajoute <key>LaunchOnlyOnce</key><true/>au dict.
msanford
Excellent point M. Sanford. launchd qui n'abandonne pas crée d'énormes fichiers journaux qui ralentissent ensuite votre Mac (en raison de la lecture et de l'écriture de tels fichiers journaux de manière continue). Je peux utiliser ce correctif sur certains logiciels commerciaux mal écrits actuellement exécutés sur mon ordinateur.
Foliovision
1
Remarque: si vous avez besoin de variables d'environnement: serverfault.com/questions/111391/…
Quandary
49

Une autre solution simple de Stack Overflow : Vous pouvez:

  • Démarrer Automator.app;
  • Sélectionnez "Application";
  • Cliquez sur "Afficher la bibliothèque" dans la barre d'outils (si masqué);
  • Ajoutez "Run shell script" (à partir des actions / utilitaires);
  • Copiez et collez votre script dans la fenêtre.
  • Essaye-le;
  • Enregistrez-le quelque part: un fichier appelé your_name.appsera créé);
  • Selon votre version de MacOSX:
    • Anciennes versions: Allez dans Préférences Système → Comptes → Éléments de connexion ou
    • Nouvelle version: Allez dans Préférences Système → Utilisateurs et groupes → Éléments de connexion (en haut à droite);
  • Ajoutez cette application nouvellement créée.

Déconnectez-vous, reconnectez-vous et vous devriez avoir terminé. ;)

Jaime M.
la source
2
Testé et fonctionne, il ne nécessite ni une édition fastidieuse de plis ni une application payante Lingon.
Lukasz
4
Cependant, il ajoute environ 1804k de passe-partout à votre shellscript à trois lignes!
android.weasel
1
Merci pour les instructions détaillées vous permettant de créer quelque chose d’utile avec Automator. Cela ne m'aidera pas seulement avec une tâche. Merci gentiment Jaime. Je l'utilise pour désactiver Turbo Boost via Turbo Boost Switcher. Je possède la version payante, mais les mécanismes de licence sont suffisamment terribles. Je préfère utiliser la version gratuite qui nécessite un lancement via un terminal pour éviter les demandes de mot de passe administrateur à chaque sortie de veille.
Foliovision
1
@ android.weasel Voir la réponse de Geekarist à l'adresse superuser.com/a/995564/255375
JD
Superuse-ful :-D, +1
Mukul Goel
28

Pour lancer des commandes lors de la connexion, vous pouvez procéder comme suit:

  • Créez un fichier texte contenant vos commandes (script bash):

    #!/bin/bash
    
    # Start the MongoDB server
    /Applications/MongoDB/bin/mongod --dbpath /usr/local/mongo/data --fork --logpath /usr/local/mongo/log
    
  • Enregistrer ce fichier dans ~/Library/Startup.cmd

  • Vous pouvez le tester en double-cliquant sur le fichier dans le Finder.
  • Rendez-le exécutable: chmod +x ~/Library/Startup.cmd
  • Ajouter ce fichier dans Préférences Système> Comptes> Éléments de connexion
Géekariste
la source
3
meilleure et la plus facile réponse à mon humble avis. beaucoup plus facile que la solution acceptée. notez qu'il se trouve dans Préférences Système> Utilisateurs et groupes> Éléments de connexion ... (pas des comptes) ... et notez également que le fichier peut être n'importe où, ne doit pas nécessairement se terminer par .cmd. juste chmod + x it.
Foreyez
5
Toutefois, les éléments de connexion s'exécutent au moment de la connexion, pas au démarrage du système. Si vous utilisez un serveur, c'est une grande différence.
not2savvy
Vous avez raison @ not2savvy. Pour un serveur, je recommanderais la réponse de @ Sridhar-Sarnobat avec @reboot. Cependant, ma réponse permettrait de démarrer un programme graphique, c'est pourquoi je pense que c'est utile.
Geekarist
Pourquoi se termine par cmdau lieu de sh?
Simin Jie
3

Vous devrez regarder comment launchdet launchctltravailler sur MacOS. Vous pouvez commencer par lire les pages de manuel pour les deux commandes. Vous pouvez ensuite regarder à l'intérieur /Library/LaunchAgents/et /Library/LaunchDaemons/trouver des exemples de configuration des applications à charger à différents moments via l' launchctlinterface.

Voici un exemple que j'ai trouvé sur Stack Overflow qui pourrait vous aider davantage.

Ayaz
la source
0

Une réponse unix très simple à ce problème m'intéressait et je l'ai trouvée sur un autre site . Voici un résumé de la solution.

La norme pour les shells de connexion est de toujours rechercher les fichiers de configuration bash avec "profile" dans le nom, dans cet ordre: / etc / profile, ~ / .bash_profile, puis ~ / .bash_login et enfin ~ / .profile. Lorsque les shells de connexion sont fermés, ils lisent ~ / .bash_logout.

Dans mon cas, je viens de créer le fichier ~ / .bash_profile, puis j'ai ouvert les préférences de l'application Mac Terminal et modifié l'option "Shell s'ouvre avec" de l'option par défaut en / bin / bash. C'est ça. Propre et simple.

markgp
la source
-3

terminal ouvert, tapez

nano ~/.bash_profile

puis ajoutez ce texte au fichier:

/Applications/MongoDB/bin/mongod --dbpath /usr/local/mongo/data --fork logpath /usr/local/mongo/log
MAX
la source
3
Cela supposerait que vous ouvriez une fenêtre de terminal après vous être connecté.
Arjan