687 votes

Comment exécuter les scripts au démarrage ?

Comment puis-je exécuter des scripts ? automatiquement au démarrage d'Ubuntu pour que je n'aie pas à les exécuter manuellement après le démarrage ?

7 votes

Si quelqu'un pouvait également indiquer QUAND et OÙ, 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 déclenchera avant que d'autres applications aient été démarrées (comme X11)

3 votes

Ce fil de réponse entier est un désordre. Le format Stack Exchange ne semble pas être le mieux adapté à cette question.

4 votes

+1 à @GabrielFair. Une GRANDE partie du problème est que la question et la réponse originales datent de DIX ANS. J'ajouterais également qu'il y a trop de façons de résoudre ce problème. Qu'est-il arrivé à la simplicité de la philosophie Unix ! Demande à quelqu'un bien informé et avec des points suffisants réécrire ce post, ou ajouter une nouvelle, mise à jour, réponse définitive pour les versions modernes d'os.

714voto

littlecharva Points 1546

Une approche consiste à ajouter un @reboot cron tâche :

  1. Running crontab -e vous permettra de modifier votre cron.
  2. En y ajoutant une ligne comme celle-ci :

    @reboot /path/to/script

    exécutera ce script au démarrage de votre ordinateur.

107 votes

El @reboot Le mot clé est un bon conseil car il n'est pas très connu.

25 votes

Joli. Une idée ? exactement quand ça déclenche ?

6 votes

Donc... cela ne fonctionnerait pas si je perdais du courant et que le PC se rallumait au retour du courant ?

242voto

NickNameNick Points 91

Selon le type de scripts que vous devez exécuter Pour les services et autres, vous devez utiliser démarrage . Mais pour un utilisateur script ceux-ci devraient être lancés comme session par gnome ! Regardez dans Système > Préférences > Applications de démarrage.

En passant, si vous avez besoin que certains scripts soient exécutés lors de la connexion au terminal, vous pouvez les ajouter à l'option .bash_login dans 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 job Upstart comme :

start on startup
task
exec /path/to/command

Sauvegardez ceci dans un .conf dans /etc/init (si vous avez besoin qu'il soit exécuté en tant que root au démarrage du système), ou dans ~/.config/upstart (si vous avez besoin qu'il qu'il s'exécute sous votre nom d'utilisateur lorsque vous vous connectez).

62 votes

Compte tenu du fonctionnement de SO et de StackExchange, pourriez-vous donner un exemple d'un script et de l'endroit où il serait placé ? Cela rendrait la réponse bien meilleure. Votre lien dit qu'il n'est pas maintenu et de regarder le livre de recettes upstart, qui est huuuge. Je n'ai pas vraiment d'idée de par où commencer.

4 votes

Et si je dois exécuter la commande en tant que root ?

2 votes

@dopatraman La réponse indique que tous les processus avec ceci sont exécutés en tant que root.

212voto

Ramiro Berrelleza Points 1017

Vous pouvez ajouter des commandes à /etc/rc.local :

sudo nano /etc/rc.local

Ceci exécute les commandes en tant que root.

Pour exécuter des commandes en tant qu'utilisateur spécifique, utilisez sudo -i -u ( -i pour exécuter également le login Shell). Par exemple, pour établir un tunnel SSH persistant, où myhost est défini dans johndoe s ~/.ssh/config archivo:

sudo -i -u johndoe autossh -nNT -L 1234:localhost:1234 myhost

Notez que si /etc/rc.local n'existe pas (comme c'est le cas sur Ubuntu depuis 16.04), vous devez ajouter un fichier ligne shebang en haut (par exemple #!/bin/bash ), et assurez-vous que le fichier est exécutable :

sudo chmod a+x /etc/rc.local

27 votes

Cela répond le plus directement à la question : comment exécuter simplement quelques scripts lorsque votre système démarre. upstart effectue une tâche plus complexe : lancer des processus de démons.

0 votes

Est-ce que je dois mettre le chemin de mon script ou il faut aussi le sh avant le chemin ?

1 votes

Donc upstart démarre les processus de démon tandis que /etc/rc.local démarre les scripts de bash ?

142voto

muru Points 180007

Pour les versions 15.04 et ultérieures :

Pour gérer un (éphémère) 1 au démarrage en utilisant systemd vous pouvez utiliser une unité systemd de type OneShot . Par exemple, créez /etc/systemd/system/foo.service contenant :

[Unit]
Description=Job that runs your user script

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

[Install]
WantedBy=multi-user.target

Alors cours :

sudo systemctl daemon-reload
sudo systemctl enable foo.service

Essentiellement, il s'agit juste de convertir un travail typique d'Upstart à un systemd (voir Systemd pour les utilisateurs de Upstart ).

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

[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 d'accès complet. Si une commande échoue, les autres ne sont pas exécutées. A - avant le chemin indique à systemd d'ignorer un état de sortie non nul (au lieu de le considérer comme un échec).

Pertinent :


Pour les sessions utilisateur, vous pouvez créer l'unité systemd dans ~/.config/systemd à la place. Cela devrait fonctionner à partir de la version 16.04, mais pas avec les versions antérieures d'Ubuntu avec systemd (puisque 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'option --user option ajoutée :

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

Shell syntaxe

Notez que, contrairement à Upstart, systemd n'exécute pas la commande Exec* à travers un Shell. Il effectue une expansion limitée des variables et une commande multiple (séparée par ; ) elle-même, mais c'est à peu près tout pour ce qui est de la syntaxe de type Shell. Pour tout ce qui est plus compliqué, comme les redirections ou les pipes, enveloppez votre commande dans sh -c '...' o bash -c '...' .


1 Par opposition aux démons à longue durée de vie.

0 votes

Est-il possible de définir une priorité sur le travail ? ou de spécifier qu'il dépend d'un autre service pour être démarré en premier ?

1 votes

@r3wt oui, il y a différentes façons de le faire. Le site WantedBy utilisé ici, par exemple, fait en sorte qu'il démarre lorsque l'option multi-user.target est atteint. Vous pouvez utiliser Before , After , Requires etc. Voir man systemd.unit

0 votes

@PerlDuck ce n'est pas la seule chose qui manquait. Merci.

38voto

Pandya Points 32443

$HOME/.config/autostart contient la liste des applications de démarrage. .desktop dans ce dossier seront exécutés au démarrage. Il peut avoir besoin de la permission d'être exécuté ( chmod +x startup.desktop ).

Exemple pour .desktop archivo:

[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 d'accès à votre script.sh Si vous placez votre script myscript en /usr/local/bin afin qu'il puisse être exécuté directement par une commande, vous pouvez écrire myscript au lieu de "</path/to/script>" .

Exemple de myscript.sh :

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

Résultat : .desktop sera lancé à partir de $HOME/.config/autostart qui exécutent script en Exec=

0 votes

Ne fonctionne pas sur Ubuntu 18.04. $HOME/.config/autostart ne contient qu'un seul fichier pour Dropbox, qui n'est pas exécutable.

1 votes

Cela a fonctionné pour moi sur Ubuntu 18.04.1. J'ai ajouté l'entrée du bureau via Recherche -> Applications de démarrage. Le résultat est exactement le même.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X