Comment exécuter des scripts au démarrage?

520

Comment puis-je exécuter des scripts automatiquement au démarrage d’Ubuntu afin de ne pas les exécuter manuellement après le démarrage?

myusuf3
la source
3
Si quelqu'un pouvait aussi montrer à la fois QUAND et QUAND, ce serait génial. Je dis cela parce que je sais qu'il y a au moins 2 façons de démarrer un script qui se lancera avant que d'autres applications aient été lancées (comme X11)
Buttink
1
Tout ce fil de réponse est un désordre. Le format de Stack Exchange ne semble pas être le mieux adapté à cette question
Gabriel Fair
1
C'est en fait assez amusant. Combien de façons différentes pourrait-il y avoir?
devios1

Réponses:

206

En fonction du type de scripts que vous devez exécuter. Pour les services et similaires, vous devez utiliser Upstart . Mais pour un script utilisateur, ceux-ci doivent être lancés en tant que scripts de session par gnome! Consultez Système> Préférences> Applications de démarrage.

Remarque: si vous avez besoin d'exécuter certains scripts lors de la connexion au terminal, vous pouvez les ajouter au fichier .bash_login de votre répertoire personnel.

Pour 14.04 et plus

Une commande simple (qui n'a pas besoin de rester en cours d'exécution) pourrait utiliser un travail Upstart tel que:

start on startup
task
exec /path/to/command

Enregistrez-le dans un .conffichier dans /etc/init(si vous avez besoin de l'exécuter en tant que root lors du démarrage du système) ou dans ~/.config/upstart(si vous avez besoin de l'exécuter en tant qu'utilisateur lorsque vous vous connectez).

LassePoulsen
la source
58
En considérant le fonctionnement de SO et StackExchange, pourriez-vous donner un exemple de script de démarrage et son emplacement? Cela en ferait une bien meilleure réponse. Votre lien indique qu'il n'est pas mis à jour et que vous devez consulter le livre de recettes Upstart, qui est énorme. Je ne sais pas trop par où commencer.
Ehtesh Choudhury
2
Que faire si j'ai besoin d'exécuter la commande en tant que root?
dopatraman
1
@dopatraman La réponse indique que tous les processus avec ceci sont exécutés en tant que root.
Astopher
4
Veuillez mettre à jour cette réponse pour expliquer quoi faire sur les systèmes exécutant systemd plutôt que par ceux qui arrivent (Ubuntu 15.04+).
3
Cette réponse n'a pas de sens pour moi. Les applications répertoriées dans system->pref->startup applicationsne peuvent être trouvées /etc/init/ni dans ~/.config/upstart. Alors, où sont définies les applications de démarrage?
phil294
554

Une approche consiste à ajouter une @reboot Cron tâche:

  1. Courir crontab -evous permettra d'éditer votre cron.
  2. Ajouter une ligne comme celle-ci:

    @reboot /path/to/script
    

    exécutera ce script une fois votre ordinateur démarré.

ceejayoz
la source
85
Le @rebootmot clé est un bon conseil, car il n'est pas largement connu.
jathanism
12
Agréable. Une idée précise du moment où cela se déclenche?
Oli
2
Donc ... cela ne fonctionnerait pas si je perdais de l’alimentation et que le PC tournait à nouveau lorsque le courant est rétabli?
Mike Wills
18
@siamii: man 5 crontabindique que cela @rebootest exécuté au démarrage (lorsque le démon cron est démarré).
Jfs
9
C'est génial. Jusque-là, cela semble meilleur que rc.localle système ne semble plus configuré par ce point (PATH, etc.). Il est étrange qu’il soit si difficile d’appeler quelque chose après le démarrage du système.
Karthik T
161

Que diriez-vous d'ajouter la commande à /etc/rc.local? vous devrez cependant utiliser l'accès sudo pour éditer ce fichier.

sudo nano /etc/rc.local
Paolo Granada Lim
la source
19
Cela répond le plus directement à la question: comment exécuter simplement des scripts au démarrage de votre système. Upstart effectue une tâche plus complexe: démarre les processus du démon.
Dogweather
1
Ainsi, les processus démarrés démarrent tandis que /etc/rc.local lance les scripts bash?
Donato
5
Devrait-il? Cela ne fonctionne plus ces jours-ci, non?
DaVince
4
Je travaille avec Ubuntu 17.04 systemd
qodeninja
3
Notez que si vous créez ce fichier vous-même (comme je l'ai fait), vous devrez alors changer le fichier en exécutable avec chmod 755 rc.local, et ajouter #!/bin/bashà la première ligne.
psitae
77

Pour 15.04 et plus tard:

Pour exécuter une commande (de courte durée) 1 au démarrage systemd, vous pouvez utiliser une unité systemd de type OneShot. Par exemple, créez /etc/systemd/system/foo.servicecontenant:

[Unit]
Description=Job that runs your user script

[Service]
ExecStart=/some/command
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Puis lancez:

sudo systemctl daemon-reload
sudo systemctl enable foo.service

Pour l’essentiel, il s’agit simplement de convertir un travail Upstart typique en un travail systemd (voir Systemd pour les utilisateurs Upstart ).

Vous pouvez exécuter plusieurs commandes à partir du même fichier de service, en utilisant plusieurs ExecStartlignes:

[Service]
ExecStart=/some/command
ExecStart=/another/command some args
ExecStart=-/a/third/command ignore failure

La commande doit toujours être donnée avec le chemin complet. Si une commande échoue, le reste n'est pas exécuté. Un -avant le chemin indique à systemd d'ignorer un état de sortie différent de zéro (au lieu de le considérer comme un échec).

Pertinent:


Pour les sessions utilisateur, vous pouvez créer l'unité systemd dans ~/.config/systemd. Cela devrait fonctionner à partir de 16.04, mais pas des versions antérieures d’Ubuntu avec systemd (étant donné que celles-ci utilisaient toujours Upstart pour les sessions utilisateur). Les unités de session utilisateur peuvent être contrôlées avec les mêmes commandes que pour les services système, mais avec l' --useroption ajoutée:

systemctl --user daemon-reload
systemctl --user status foo.service

Syntaxe shell

Notez que, contrairement à Upstart, systemd n'exécute pas les Exec*commandes via un shell. Il effectue un développement de variable limité et plusieurs commandes (séparées par ;) lui-même, mais c'est à peu près tout pour la syntaxe de type shell. Pour tout ce qui est plus compliqué, dites redirection ou pipes, insérez votre commande dans sh -c '...'ou bash -c '...'.


1 Par opposition aux démons à vie longue.

muru
la source
est-il possible de définir une priorité au travail? ou spécifier que cela dépend d'un autre service à démarrer en premier?
R3WT
1
@ r3wt oui, il y a différentes façons de le faire. Le WantedByutilisé ici, par exemple, le fait démarrer quand le multi-user.targetest atteint. Vous pouvez utiliser Before, After, Requires, etc. Voirman systemd.unit
muru
@PerlDuck pas la seule chose qui lui manquait. Merci!
Muru
Je vous en prie. - Au fait, cela RemainAfterExitdépend du service que vous démarrez et de son comportement souhaité. Par exemple, /bin/df -h<s> devrait </ s> avoir RemainAfterExit=no.
PerlDuck
@PerlDuck Il n'y a rien d'inhérent à dfces besoins RemainAfterExit=no. Sauf si vous souhaitez exécuter la commande de manière répétée à chaque exécution systemctl start foo.
Muru
71

Il existe différentes manières d'exécuter automatiquement des commandes:

  1. Le arriviste système exécute tous les scripts dont il trouve une configuration dans le répertoire /etc/init. Ces scripts seront exécutés lors du démarrage du système (ou en réponse à certains événements, par exemple une demande d'arrêt) et sont donc l'endroit idéal pour exécuter des commandes qui n'interagissent pas avec l'utilisateur. tous les serveurs sont démarrés en utilisant ce mécanisme.

    Vous pouvez trouver une introduction lisible sur: http://upstart.ubuntu.com/getting-started.html les pages de manuel man 5 initet man 8 initvous en donner les détails.

  2. Un script shell nommé .gnomercdans votre répertoire personnel est automatiquement créé chaque fois que vous vous connectez à une session GNOME. Vous pouvez y mettre des commandes arbitraires. Les variables d'environnement que vous définissez dans ce script seront visibles par tous les programmes que vous exécuterez dans votre session.

    Notez que la session ne commence pas tant que le .gnomercscript n'est pas terminé. Par conséquent, si vous souhaitez démarrer automatiquement un programme de longue durée, vous devez ajouter &à l'appel du programme, afin de le détacher du shell en cours d'exécution.

  3. L'option de menu Système -> Préférences -> Applications de démarrage vous permet de définir les applications à démarrer au démarrage de votre session graphique (Ubuntu en prédéfinit certaines) et de les ajouter ou de les supprimer à votre goût. Cela a presque le même objectif et la même portée du .gnomercscript, sauf que vous n'avez pas besoin de connaître la shsyntaxe (mais vous ne pouvez pas non plus utiliser de shconstruction de programmation).

Riccardo Murri
la source
11
3) "Cela a presque le même objectif et la même portée que le script .gnomerc", sauf .gnomercqu'apparemment s'exécute avant le chargement de Unity et, Startup Applicationsapparemment, après le chargement de Unity. J'ai dû exécuter un programme qui se trouve dans la barre de menus d'Unity et cela a fait une énorme différence dans ce cas!
Ce Guy brésilien
1
@ ruda.almeida Merci de l'avoir signalé. La réponse a été écrite avant l’unité.
Riccardo Murri
1
sudo update-rc.d myscript.sh defaults, où /etc/init.d/myscript.sh est votre script, l’exécute également au démarrage.
Dan Dascalescu
27
$HOME/.config/autostart
  • Cet emplacement contient la liste des applications de démarrage.
  • .desktop fichier peut être mis ici qui sera exécuté au démarrage.

Exemple de .desktopfichier:

Mettre le .desktopfichier suivant dans $HOME/.config/autostartet donné chmod +x:

[Desktop Entry]
Type=Application
Exec="</path/to/script>"
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name=Startup Script

Ici, "</path/to/script>"est remplacé par le chemin vers votre script.sh
(généralement recommandé à /usr/local/binso-, qui peut être exécuté directement à l'aide de la commande say myscriptreplace with "</path/to/script>").

Exemple d'exemple de script.sh:

#!/bin/bash
<commands to be executed>
exit

Résultat: le .desktopfichier sera lancé à partir $HOME/.config/autostartduquel le script sera exécuté parExec=

Par conséquent, vous pouvez exécuter votre script shell souhaité au démarrage!

Pandya
la source
18

Pour des choses simples, vous pouvez ajouter une commande dans Système-> Préférences-> Sessions pointant vers l'emplacement de votre script.

Sinon, vous pouvez l'ajouter à /etc/init.d/rc.local ou créer un travail récent si le contenu est de niveau inférieur .

Consultez https://help.ubuntu.com/community/UbuntuBootupHowto pour plus d'informations.

tutuca
la source
7

cron réponse mise en œuvre différente de la plus votée

Cette réponse utilise toujours, cronmais utilise une méthode différente de celle de la réponse votée en haut. Cela fonctionne depuis Ubuntu 16.04 mais probablement pris en charge beaucoup plus tôt. C'est juste que j'ai commencé à utiliser cronpour exécuter des tâches lorsque l'ordinateur démarre depuis 16.04.

Quand croncourt-il?

Dans les commentaires, quelqu'un a demandé "quand est-ce qu'ils courent?". Vous pouvez dire dans syslog / journalctl:

$ journalctl -b | grep cron
Jan 02 16:54:40 alien cron[919]: (CRON) INFO (pidfile fd = 3)
Jan 02 16:54:40 alien cron[919]: (CRON) INFO (Running @reboot jobs)
Jan 02 16:54:40 alien systemd[1]: Started Run anacron jobs.
Jan 02 16:54:40 alien anacron[949]: Anacron 2.3 started on 2018-01-02
Jan 02 16:54:40 alien anacron[949]: Normal exit (0 jobs run)
Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[954]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[951]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[950]: pam_unix(cron:session): session opened for user root by (uid=0)
Jan 02 16:54:40 alien CRON[985]: (root) CMD (   /usr/local/bin/cron-reboot-cycle-grub-background)
Jan 02 16:54:40 alien CRON[954]: pam_unix(cron:session): session closed for user root
Jan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587
Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): session closed for user root
Jan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587
Jan 02 16:54:40 alien CRON[950]: pam_unix(cron:session): session closed for user root

Une chose à noter est la cronpossibilité de vous envoyer par courrier électronique l’état des travaux exécutés et les @reboottravaux exécutés de sorte que le gestionnaire de réseau initial ne puisse être exécuté à moins que vous ne mettiez une sleepcommande dans votre (vos) script (s).

Où mettre vos scripts

Mettez vos scripts dans le répertoire /etc/cron.d:

$ ll /etc/cron.d
total 44
drwxr-xr-x   2 root root  4096 Nov 26 19:53 ./
drwxr-xr-x 139 root root 12288 Dec 31 13:58 ../
-rw-r--r--   1 root root   244 Dec 28  2014 anacron
-rw-r--r--   1 root root   148 Feb 18  2017 cycle-grub-background
-rw-r--r--   1 root root   138 Mar  5  2017 display-auto-brightness
-rw-r--r--   1 root root   460 Nov 26 19:53 nvidia-hdmi-sound
-rw-r--r--   1 root root   102 Feb  9  2013 .placeholder
-rw-r--r--   1 root root   224 Nov 19  2016 touch-vmlinuz
-rw-r--r--   1 root root   700 Aug  5 11:15 turn-off-hyper-threading

A quoi ressemble un script?

Voici quelques scripts que j'ai configurés pour exécuter chaque démarrage:

$ cat /etc/cron.d/cycle-grub-background SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 
@reboot   root    /usr/local/bin/cron-reboot-cycle-grub-background

$ cat /etc/cron.d/touch-vmlinuz
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
@reboot   root    touch "/boot/vmlinuz-"`uname -r`
WinEunuuchs2Unix
la source
1
Il existe de nombreuses façons d’ajouter des tâches cron, mais l’essentiel de la réponse hautement votée et votre réponse sont toujours les @reboot.
Muru
Les méthodes alternatives pour l'ajout de crontabs doivent être publiées sur askubuntu.com/q/2368/158442 , qui concerne explicitement l'ajout de travaux Cron.
Muru
1
Je ne suis pas d'accord. Le noyau de la réponse en question utilise crontab -ece que certains considèrent comme l'un des arts noirs dû à une interface semblable à vim. D'autre part, cette réponse pourrait plaire à ceux dont le cerveau est câblé d'une certaine manière. Nous ne sommes pas tous fondus du même moule. Là encore, cette réponse a déjà un vote négatif, nous allons donc laisser la démocratie suivre son cours.
WinEunuuchs2Unix
2
Oh s'il vous plait. Vous et moi savons tous les deux que l'éditeur peut être changé.
Muru
@muru Oui probablement parce que vous m'avez appris et j'ai appris à changer de rédacteur en quelque chose comme nano ou quelques autres CLI. Mais je suis dans le camp de Gedit. En outre, crontab -efait apparaître des souvenirs d'astérisques ("*") pendant des minutes, des heures, etc. pour lesquels j'ai toujours trouvé que je devais rechercher des instructions dans Google. Je trouve toujours en utilisant /etc/cron.det /etc/cron.dailymon aller au choix. Surtout depuis qu'il reflète /etc/udev/rules.det /etc/systemd/system-sleepméthodes. Cela semble juste être un bon ajustement.
WinEunuuchs2Unix
5

Vous devriez utiliser Upstart pour cela. Upstart est utilisé pour les processus Ubuntu qui sont automatiquement démarrés. C'est une solution améliorée comme les anciens scripts init.d System-V. Il vous permet également de définir les conditions préalables au début de votre script (c.-à-d. Avez-vous besoin du fonctionnement du réseau? Etc.)

txwikinger
la source