Comment exécuter un script au démarrage en tant que root

59

J'avais un script qui active automatiquement mon wifi sans utiliser networkmanager, mais je ne sais pas comment exécuter le script en tant que root pendant le démarrage du système. Comment faire pour que le script s'exécute automatiquement lors du démarrage?

utilisateur128712
la source
Les programmes à démarrage automatique sont configurés dans des autostartmanifestes ou dans des *.servicefichiers situés à plusieurs endroits, ainsi que dans init.dou crontab. Voir ceci: unix.stackexchange.com/a/525845/43233
Noam Manos le

Réponses:

54

Placez le script que vous souhaitez exécuter dans le répertoire /etc/init.d et rendez-le exécutable.

chmod 755 myscript

Une fois que cela est fait, créez un lien symbolique dans le répertoire de niveau d'exécution que vous souhaitez utiliser. Par exemple, si vous souhaitez exécuter un programme dans le niveau d'exécution graphique 2, le niveau d'exécution par défaut pour Ubuntu, vous devez le placer dans le /etc/rc2.drépertoire. Vous ne pouvez simplement pas y placer le répertoire, vous devez indiquer quand il sera exécuté en indiquant le démarrage avec un «S» et l'ordre d'exécution est important. Placez-le après tout ce qui se trouve dans le répertoire en lui attribuant un numéro plus élevé.

Si le dernier script à exécuter est rc.localet qu'il est nommé, S99rc.localvous devez ajouter votre script en tant que S99myscript.

ln -s /etc/init.d/myscript /etc/rc3.d/S99myscript

Chaque /etc/rc*.drépertoire rétrocompatible a des liens symboliques vers le /etc/init.d/répertoire.

Radu Rădeanu
la source
1
Notez que sous Ubuntu Server 14.04, je devais utiliser /etc/rc2.d, au lieu de ce rc3.dqui est indiqué dans l'exemple. Il semble que ce rc2.dn’est pas seulement le niveau d’exécution graphique.
Brad
1
cd /etc/rc`cat /etc/init/rc-sysinit.conf | grep "env DEFAULT_RUNLEVEL" | grep -oP "\d"`.dvous mènera à quel /etc/rc?.drépertoire correspond à votre niveau d'exécution par défaut.
Kevin
1
Au lieu de cela: "Si le dernier script à exécuter est rc.localet qu’il est nommé, S99rc.localvous devez ajouter votre script en tant que S99myscript.". Voulez-vous dire: "Si le dernier script à exécuter est myscriptet qu'il est nommé, S99myscriptvous devez ajouter votre script en tant que S99myscript." ???
Dor
6
Gardez à l'esprit que cela ne fonctionnera pas avec systemd (c'est-à-dire à partir d'Ubuntu 16.04). Voir cela à la place.
Alexander Revo
26

Inclure la commande dans /etc/rc.local. Il sera exécuté chaque fois que le niveau d'exécution de l'utilisateur change.

Remarque: Vous devez placer la commande avant la dernière ligne dans /etc/rc.local qui contient: "exit 0".

thefourtheye
la source
3
Remarque: vous devez placer la commande avant la dernière ligne /etc/rc.localqui contient: exit 0
rubo77
3
/etc/rc.localdans Ubuntu 15.10 a commenté que "Ce script est exécuté à la fin de chaque niveau d’exécution multi-utilisateur." Donc, le script peut être exécuté plusieurs fois au démarrage, non?
Jarno
@ jamo, oui, à chaque niveau d'exécution. Je ne sais pas comment cela est lié à l'exécution "au démarrage", ce qui signifie généralement "exécuter une fois au démarrage".
erm3nda
17

Utilisez une crontaboption pour que votre script soit exécuté après le redémarrage,

vous pouvez le faire en ajoutant du @rebootcode dans cron

Ouvrez la crontab par l'utilisateur root:

$ sudo crontab -e

Ajoutez le prochain enregistrement en bas:

@reboot yourScriptPath 

Cela fera ce que vous voulez.

hs.chandra
la source
Voulez-vous dire utiliser la commande crontab -e, qui n'a pas besoin des privilèges de superutilisateur? Je me demande si elle peut exécuter des scripts devant être exécutés en tant que root.
Jarno
J'ai testé cela. Il n'exécute pas le script en tant que root.
mardi
4
Vous devez ajouter la ligne lors de l'exécution de la commande sudo crontab -epour lui permettre d'exécuter le script en tant que root lors du démarrage.
jarno
n'oubliez pas de supprimer /var/run/crond.reboot, sinon, ne pas exécuter la tâche
Albert Català
Pour mémoire, je suis sûr que @jarno le saura déjà. Chaque utilisateur a sa propre tâche périodique, donc si vous l'ajoutez à celle de votre utilisateur (exécutant crontab -e sans sudo), le script sera exécuté par votre utilisateur. Vous devez donc l'exécuter en tant que root pour lui permettre d'exécuter des scripts en tant que root au démarrage.
Eddieferetro
9

Cela a fonctionné pour moi sur Ubuntu 17.04:

  1. créer un fichier de script de visite comme disable_cdromvous le souhaitez. Dans mon cas home/yterle/disable_cdrom. Dans mon cas:

    #!/bin/sh
    eject /dev/sr0 -i 1
  2. le rendre exécutable chmod 775 disable_cdrom

  3. naviguez /etc/systemd/systemet créez-y un servicefichier. Par exemplesudo gedit /etc/systemd/system/disable_cdrom.service

Mon disable_cdrom.serviceressemble à ceci:

[Unit]
Description=Disable cdrom

[Service]
Type=oneshot
ExecStart=/bin/sh /home/yterle/disable_cdrom

[Install]
WantedBy=multi-user.target

ExecStartpoints pour exécuter votre script avec/bin/sh

Puis exécutez systemctl enable disable_cdrom.servicepour activer le service systemd

YTerle
la source
1
Voter cela car c'est ce que je cherchais, mais je pense que vous voulez diresystemctl enable disable_cdrom.service
KennetRunner
5

Incluez votre fichier de script /etc/init.d/ avec l'autorisation Executable, puis définissez un niveau d'exécution différent

$ update-rc.d script-name default

Cela mettra votre script au démarrage.

MS Parmar
la source
Ne fonctionne pas pour moi sur Kali Linux v2.0. Vouliez-vous dire update-rc.d script-name enable?
Sopalajo de Arrierez
update-rc.d <script-nom> script shell par défaut que vous avez copié à /etc/init.d/ <nom-script>
MS Parmar
4

Créez un fichier texte comme celui-ci dans /etc/cron.d/:

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

@reboot   root    yourScriptPath

(Vous devez remplacer yourScriptPathpar le chemin du script que vous souhaitez exécuter.)

Jarno
la source
1

Faites attention avec l'ajout du script à rc.local- j'étais bloqué dans l'écran de démarrage à cause de cela. Appuyez sur Alt+ pour F1révéler ce qui se passait derrière l'écran de démarrage (le script rc.localétait en cours d'exécution).

Je ne pouvais pas en sortir.

  • Ctrl+ Alt+ Delou
  • Alt+ PrtSc+ Kou
  • Ctrl+ Alt+F#

rien ne fonctionne.

Je devais démarrer à partir d'une image USB Ubuntu, trouver rc.local, me donner les droits de fichier et de le supprimer. Je suppose que vous ne devriez pas faire de choses si vous ne savez pas ce que vous faites.

Gašper Čefarin
la source