web-dev-qa-db-fra.com

Comment exécuter des scripts au démarrage?

Comment puis-je exécuter des scripts automatiquement au démarrage d’Ubuntu, donc je n’ai pas à les exécuter manuellement après le démarrage?

497
myusuf3

Selon le type de scripts que vous devez exécuter. Pour les services et similaires, vous devez utiliser pstart . 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.

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 fichier .conf dans /etc/init (si vous devez 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).

200
LassePoulsen

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

  1. Lancer crontab -e vous 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é.

531
ceejayoz

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
154
paolo granada lim

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

  1. Le système pstart exécutera tous les scripts à partir desquels il trouve une configuration dans le répertoire /etc/init. Ces scripts s'exécutent au démarrage du système (ou en réponse à certains événements, par exemple une demande d'arrêt) et sont donc l'endroit où exécuter les 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 à l'adresse suivante: http://upstart.ubuntu.com/getting-started.html les pages de manuel man 5 init et man 8 init vous donnent tous les détails.

  2. Un script Shell nommé .gnomerc dans votre répertoire de base 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 démarre pas tant que le script .gnomerc 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 quelques-unes), et ajoutez ou supprimez-les à votre goût. Cela a presque le même objectif et la même portée que le script .gnomerc, sauf que vous n'avez pas besoin de connaître la syntaxe sh (mais vous ne pouvez pas non plus utiliser de construction de programmation sh).

70
Riccardo Murri

Pour 15.04 et plus tard:

Courir un (éphémère)1 commande au démarrage à l'aide de 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

Puis lancez:

Sudo systemctl daemon-reload
Sudo systemctl enable foo.service

Il s’agit essentiellement de convertir n 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 lignes ExecStart:

[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 plutôt 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'option --user ajoutée:

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

Syntaxe shell

Notez que, contrairement à Upstart, systemd n'exécute pas les commandes Exec* 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, placez votre commande dans sh -c '...' ou bash -c '...'.


1Par opposition aux démons à vie longue.

66
muru
$HOME/.config/autostart
  • Cet emplacement contient la liste des applications de démarrage.
  • Le fichier .desktop peut être placé ici et sera exécuté au démarrage.

Exemple d'exemple pour le fichier .desktop:

Mettre le fichier .desktop suivant dans $HOME/.config/autostart et 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 chemin vers votre script.sh
(généralement recommandé à /usr/local/bin pour que cela puisse être exécuté directement à l'aide de la commande say myscript remplacée par "</path/to/script>").

Exemple de code script.sh:

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

Résultat: le fichier .desktop sera lancé à partir de $HOME/.config/autostart qui exécute le script par Exec=

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

27
Pandya

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

Vous pouvez également l’ajouter à /etc/init.d/rc.local ou créer un travail pstart s’il s’agit d’un niveau plus bas des trucs.

Jetez un oeil à https://help.ubuntu.com/community/UbuntuBootupHowto pour plus d'informations

18
tutuca

Vous devriez utiliser pstart 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 (par exemple, avez-vous besoin que le réseau soit en cours d'exécution? Etc.)

5
txwikinger

cron answer implémenté différent du plus voté

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

Quand cron est-il exécuté?

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 cron peut vous envoyer le statut des tâches en cours et @reboot exécuter si tôt le gestionnaire de réseau et le courrier électronique ne sera pas exécuté à moins que vous ne mettiez une commande sleep dans votre (vos) script (s).

Où mettre vos scripts

Placez 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`
3
WinEunuuchs2Unix