Comment démarrer une application automatiquement au démarrage

27

Je suis nouveau sur Linux et j'ai hâte de démarrer l'application (qui bascule une led toutes les 10 secondes). J'ai écrit le programme d'application et cela fonctionne bien mais maintenant je veux le démarrer automatiquement au démarrage.

La documentation ici dit de copier le script de démarrage dans le /etc/init.drépertoire et de créer un lien symbolique vers le script copié dans le rc.drépertoire.

Quelle devrait être l'extension et le nom de ces fichiers de script? Pouvons-nous ajouter manuellement le lien symbolique rc.dou existe-t-il une procédure spécifique pour cela?

Une suggestion sur la façon d'y parvenir?

gorge
la source
La façon préférée d'ajouter un script d'initialisation au démarrage varie selon les distributions. Certains sont même en train de les supprimer progressivement en faveur de upstart et systemd. Je ne recommanderais pas simplement d'utiliser "&" en arrière-plan, car quelque chose comme Debian le start-stop-daemongère mieux (bien qu'il soit préférable que le programme lui-même démonifie). Quelle distro utilisez-vous? En dehors des types MIME de bureau, les extensions de fichier n'ont aucun sens dans * nix et il est préférable que les exécutables n'en aient pas.
jordanm
Si vous utilisez petalogix, suivez simplement cette documentation - aucun nom spécial requis, faites comme ils disent. L'avez-vous essayé? Quels problèmes rencontrez-vous? (Sinon, veuillez préciser votre distribution et expliquer ce qui ne fonctionne pas avec ce que vous avez essayé.)
Mat
J'utilise Debian «wheezy» pour RPi.
gorge
1
si vous devez le faire environ toutes les 10 secondes (c'est-à-dire pas 10 secondes net), vous voudrez peut-être utiliser à la cronplace.
peterph
@peterph: mais il semble que le programme bascule la LED toutes les 10 secondes, pas un programme exécuté toutes les 10 secondes.
Zorawar

Réponses:

19

Voici l'extrait de http://www.debian-administration.org/articles/28 qui semble répondre à votre question.

Remarque: Dans l'exemple de script ci-dessous, ajoutez simplement un appel à la start)section " " pour lancer réellement votre programme. Vous pouvez tester la fonctionnalité du script sans redémarrer le système: appelez-le avec le chemin complet et en lui donnant un paramètre de " start" ou " stop"

Voici:

Debian utilise un système d'initialisation de type Sys-V pour exécuter des commandes lorsque le niveau d'exécution du système change - par exemple au démarrage et à l'arrêt.

Si vous souhaitez ajouter un nouveau service à démarrer au démarrage de la machine, vous devez ajouter le script nécessaire au répertoire /etc/init.d/. De nombreux scripts déjà présents dans ce répertoire vous donneront un exemple du genre de choses que vous pouvez faire.

Voici un script très simple qui est divisé en deux parties, du code qui s'exécute toujours et du code qui s'exécute lorsqu'il est appelé avec "start" ou "stop".

#! /bin/sh
# /etc/init.d/blah
#

# Some things that run always
touch /var/lock/blah

# Carry out specific functions when asked to by the system
case "$1" in
  start)
    echo "Starting script blah "
    echo "Could do more here"
    ;;
  stop)
    echo "Stopping script blah"
    echo "Could do more here"
    ;;
  *)
    echo "Usage: /etc/init.d/blah {start|stop}"
    exit 1
    ;;
esac

exit 0

Une fois que vous avez enregistré votre fichier à l'emplacement correct, assurez-vous qu'il est exécutable en exécutant " chmod 755 /etc/init.d/blah".

Ensuite, vous devez ajouter les liens symboliques appropriés pour que le script soit exécuté lorsque le système tombe en panne ou monte.

La façon la plus simple de le faire est d'utiliser la commande spécifique à Debian update-rc.d:

root@skx:~# update-rc.d blah defaults
 Adding system startup for /etc/init.d/blah ...
   /etc/rc0.d/K20blah -> ../init.d/blah
   /etc/rc1.d/K20blah -> ../init.d/blah
   /etc/rc6.d/K20blah -> ../init.d/blah
   /etc/rc2.d/S20blah -> ../init.d/blah
   /etc/rc3.d/S20blah -> ../init.d/blah
   /etc/rc4.d/S20blah -> ../init.d/blah
   /etc/rc5.d/S20blah -> ../init.d/blah
Alexander Shcheblikin
la source
dois-je réellement placer ce script dans etc / init.d / ou la ligne en haut, # /etc/init.d/blah, indique-t-elle un emplacement pour le shell?
user137717
Je reçois "-sh: update-rc.d: commande introuvable"
m4l490n
2
Les nouveaux systèmes utilisent systemdde nombreuses choses, y compris pour la configuration de démarrage. Utilisez systemctlpour contrôler et configurer systemd.
Alexander Shcheblikin
4

La meilleure façon est de vérifier la source du package de votre distribution pour un service système régulier, par exemple pour OpenSSH - vous verrez quelles sont les bonnes pratiques. Après tout, l'une des raisons de l'open-source est de pouvoir apprendre des sources.

peterph
la source
2
Un excellent conseil! Vraiment sage et pertinent, et à l'écoute de tous les Distos. (Et accessoirement, répond à la partie "nouveau à Linux" et "comment faire" de la question. Je vais utiliser cette réponse pour améliorer mes scripts de démarrage / arrêt.
Bruce0
3

Utilisez Supervisor, un programme efficace qui gère et enregistre les applications de démarrage avec des arguments. En savoir plus sur http://supervisord.org/running.html et (Suivez les instructions d'installation.

Créez un fichier de conf à /etc/supervisor/conf.d/{PROGRAM_NAME}.confet voici le code,

[program:{PROGRAM_NAME}]
command=/usr/bin/{PROGRAM_NAME} -arg1 -arg2
autostart=true  
autorestart=true  
stderr_logfile=/var/log/supervisor/{PROGRAM_NAME}.err.log  
stdout_logfile=/var/log/supervisor/{PROGRAM_NAME}.out.log  

Exécutez ensuite à partir de la ligne cmd:

supervisorctl reload

Cosmo Arun
la source
Alors que votre réponse est très bien, je pense que vous devriez la changer pour montrer que "recharger supervisorctl" doit être exécuté à partir de la CLI, ne pas être inséré dans le fichier .conf
dlewin
3

L'utilisation crontabest beaucoup plus facile.

Utilisez crontab -epour modifier la crontab de l'utilisateur.
Ajoutez la ligne suivante à la fin:

@reboot <command>

Exemples:

  • @reboot my_script.sh
  • @reboot python my_script.py arg1 arg2

Enfin, utilisez crontab -lpour vous assurer que votre script a été ajouté à la liste.

Jithin Pavithran
la source
Je me demande pourquoi cette réponse a reçu des votes négatifs? Cela semble être une solution très simple, et qui utilise crontab - que tout le monde connaît et comprend probablement déjà.
kolinko
1

Nouvelles versions du support Linux systemd(comme l'a dit @AlexanderShcheblikin). Il a plus de fonctionnalités et est plus portable que la solution spécifique à Debian.

Veuillez lire ce très bon guide .

Voici une référence rapide du strict minimum nécessaire:

  1. Un script (par exemple myscript.sh) avec des autorisations exécutables.
  2. Un fichier Unit (par exemple myservice.service) avec l'extension ".service" /etc/systemd/systemavec 644 autorisations qui contient la commande pour exécuter le script. Par exemple,

:

[Unit]
Description=Example systemd service.

[Service]
Type=simple
ExecStart=/bin/bash /path/to/myscript.sh

[Install]
WantedBy=multi-user.target
  1. Exécutez la commande sudo systemctl enable myservicepour l'activer au démarrage.
mareoraft
la source