Lancer automatiquement un programme au démarrage de Debian


#1

Bonjour,

Vous l’avez bien compris tout est dans le titre
Mon serveur est sur Debian squeeze 2.6.39.4.

J’ai créer un script dans /home/serveur/bash/demarrage/etat-connxion-internet.sh mais comme je n’ai pas d’interface graphique comme faire ?
Je me connecte à mon serveur en ssh depuis mon pc local.

J’ai créer un service

Puis j’ai mis ceci dans mon fichier avec nano

Mon fichier

root@debian:~# cat -n /etc/init.d/etat-connexion-internet 1 #! /bin/sh -e 2 3 DAEMON="/home/serveur/bash/demarrage/etat-connexion-internet.sh" #ligne de commande du programmeinternet 4 nom="etat-connxion-internet" #nom du programme 5 start() 6 { 7 $DAEMON 8 echo "start $nom" 9 } 10 11 stop() 12 { 13 kill $nom 14 echo "stop $nom" 15 } 16 17 restart() 18 { 19 stop; 20 sleep 1; 21 start; 22 } 23 case $1 in 24 start) 25 start;; 26 stop) 27 stop;; 28 restart) 29 restart;; 30 *) 31 start;; 32 esac 33 root@debian:~#

Ensuite, je rendu mon script executable

Mais quand je fait un test , j’ai ce message

root@debian:~# /etc/init.d/etat-connexion-internet start /etc/init.d/etat-connexion-internet: 32: /home/serveur/bash/demarrage/etat-connexion-internet.sh: Permission denied root@debian:~#

Et quand je l’execute en directe c’est pareil

root@debian:~# /home/serveur/bash/demarrage/etat-connexion-internet.sh -bash: /home/serveur/bash/demarrage/etat-connexion-internet.sh: Permission non accordée root@debian:~#

Droit du service

root@debian:~# ls -al /etc/init.d/e* -rwxr-xr-x 1 root root 398 23 avril 20:50 /etc/init.d/etat-connexion-internet -rwxr-xr-x 1 root root 6441 25 janv. 2010 /etc/init.d/exim4 root@debian:~#

Droit du script

root@debian:~# ls -al /home/serveur/bash/demarrage/ total 12 drwxr-xr-x 2 serveur serveur 4096 23 avril 19:19 . drwxr-xr-x 4 serveur serveur 4096 23 avril 15:37 .. -rw-rw-r-- 1 serveur serveur 977 23 avril 19:19 etat-connexion-internet.sh root@debian:~#

Pourtant je devrai avoir les droit en root ???

Comment faire ?
Merci.


#2

Salut !

Pour lancer un service au démarrage de l’ordinateur, c’est bien dans le répertoire /etc/init.d que cela se passe. Il te faut y placer ton script (avec les droits en exécution, évidemment).

Pour bien faire, il faut que ton script présente un entête conforme. Par exemple, pour Samba :

[code]#!/bin/sh

BEGIN INIT INFO

Provides: samba

Required-Start: $network $local_fs $remote_fs

Required-Stop: $network $local_fs $remote_fs

Default-Start: 2 3 4 5

Default-Stop: 0 1 6

Should-Start: slapd cups

Should-Stop: slapd cups

Short-Description: start Samba daemons (nmbd and smbd)

END INIT INFO[/code]

Lire la documentation officielle à ce sujet : wiki.debian.org/LSBInitScripts

Il y a d’autres nécessités, comme intégrer à ton script les actions « start, stop, restart », afin qu’il sache quoi faire lorsqu’on lui passe en paramètre. Comme par exemple :

Enfin, il faut exécuter la commande suivante, pour que le système intègre effectivement ton script dans la séquence des services à exécuter (puis arrêter) au démarrage (puis à l’arrêt) en tenant compte des informations données dans l’entête décrit précédemment :

Ceci n’est à faire qu’une seule fois, il ne sera a priori pas nécessaire de relancer cette commande. Tu peux modifier à loisir ton script, les modifications seront automatiquement prises en compte lors de sa prochaine exécution.


#3

c’est un peu overkill de faire comme ça pour lancer juste un script (à mon avis), c’est plutôt fait pour les démons & services.

voir plutôt du côté de /etc/rc.local


#4

Si c’est pour le lancer une seule fois, et que visiblement ça concerne une interface, j’utiliserai l’option post-up dans le fichier interfaces.
isalo.org/wiki.debian-fr/Le_ … interfaces


#5

Bonsoir,

J’ai pas vue vos réponses pendant que je modifié mon 1er message.
Entre temps j’ai créer un service et l’ai testé.
J’ai un problème de droit.
Voir mon 1er message modifier.

piratebab

[quote]Si c’est pour le lancer une seule fois, et que visiblement ça concerne une interface, j’utiliserai l’option post-up dans le fichier interfaces.
isalo.org/wiki.debian-fr/Le_ … interfaces[/quote]
Non c’est pour un serveur sans interface graphique.

Merci.


#6

piratebab parlait d’une interface ethernet, pas d’une interface graphique :slightly_smiling:


#7

Bonsoir,

J’ai dû tout modifier suite à ce message :

root@debian:~# /etc/init.d/etat-connexion-internet start Starting system etat-connexion-internet Daemon:start-stop-daemon: warning: this system is not able to track process names longer than 15 characters, please use --exec instead of --name. . root@debian:~#

Donc je recommence à zero.

J’ai renommé mon script /bash/demarrage/etat-connxion-internet.sh en
/home/serveur/bash/demarrage/eci.sh.

Puis je crée le fichier du service au nom de mon service

Contenu du fichier service

root@debian:~# cat -n /etc/init.d/eci 1 #! /bin/sh -e 2 #"Script bash Pour savoir l'état d'une connexion internet. 3 4 DAEMON="/home/serveur/bash/demarrage/eci.sh" #ligne de commande du programme 5 #DEAMON_OPT="-d -p -f /home/xxx/xxxx/xxxxxx.ini" #argument à utiliser par le programme 6 DAEMONUSER="root" #utilisateur du programme 7 DEAMON_NAME="eci" #Nom du programme (doit être identique à l'exécutable) 8 9 PATH="/sbin:/bin:/usr/sbin:/usr/bin" #Ne pas toucher 10 11 test -x $DAEMON || exit 0 12 13 . /lib/lsb/init-functions 14 15 d_start () { 16 log_daemon_msg "Starting system $DEAMON_NAME Daemon [Ok] " 17 start-stop-daemon --background --name $DEAMON_NAME --start --quiet --chuid $DAEMONUSER --exec $DAEMON -- $DEAMON_OPT 18 log_end_msg $? 19 } 20 21 d_stop () { 22 log_daemon_msg "Stopping system $DEAMON_NAME Daemon [Ok] " 23 start-stop-daemon --name $DEAMON_NAME --stop --retry 5 --quiet --name $DEAMON_NAME 24 log_end_msg $? 25 } 26 27 case "$1" in 28 29 start|stop) 30 d_${1} 31 ;; 32 33 restart|reload|force-reload) 34 d_stop 35 d_start 36 ;; 37 38 force-stop) 39 d_stop 40 killall -q $DEAMON_NAME || true 41 sleep 2 42 killall -q -9 $DEAMON_NAME || true 43 ;; 44 45 status) 46 status_of_proc "$DEAMON_NAME" "$DAEMON" "system-wide $DEAMON_NAME" && exit 0 || exit $? 47 ;; 48 *) 49 echo "Usage: /etc/init.d/$DEAMON_NAME {start|stop|force-stop|restart|reload|force-reload|status}" 50 exit 1 51 ;; 52 esac 53 exit 0 root@debian:~#

Ensuite je donne les droits d’exécution au fichier service

Puis je rends mon script exécutable

Maintenant je test.

Démarrage du service

root@debian:~# /etc/init.d/eci start Starting system eci Daemon:. root@debian:~#

Arrêt du service

root@debian:~# /etc/init.d/eci stop Stopping system eci Daemon:Complété root@debian:~#

Je remarque que le service ne s’arrête pas et continue à écrire dans le fichier /home/serveur/Rapports/2013-etat-connxion-internet.txt .
Je vérifie le statut du service.

Statut du service

root@debian:~# /etc/init.d/eci status /home/serveur/bash/demarrage/eci.sh is not running ... failed! root@debian:~#

Je force l’arrêt du service

root@debian:~# /etc/init.d/eci force-stop Stopping system eci Daemon [Ok] :Complété root@debian:~# mais c’est pareil il continu a écrire dans le fichier.

Afficher tous les processus

root@debian:~# ps -alx Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html 4 0 24496 1 20 0 4232 1244 wait S ? 0:00 /bin/bash /home/serveur/bash/demarrage/eci.sh 4 0 24690 1 20 0 4232 1244 wait S ? 0:00 /bin/bash /home/serveur/bash/demarrage/eci.sh root@debian:~#

Pour l’arrêter j’ai du faire

root@debian:~# pkill -9 eci.sh root@debian:~#

Comment faire pour pouvoir arrêter mon service ??
Et comment rectifier le problème du service Pour le stop et le status qui devrait me dire si il est arrêté ou si il est en marche ??

Merci.


#8

Salut !

Je suis pas forcément un grand spécialiste de la question. La commande start va exécuter /home/serveur/bash/demarrage/etat-connexion-internet.sh et la commande stop va tuer /home/serveur/bash/demarrage/etat-connexion-internet.sh. Ça ne peut pas marcher car le processus est etat-connexion-internet.sh et pas tout le chemin complet.

Sans parler qu’il y a plein d’options dans ton script qui m’ont l’air inutiles voire redondantes :slightly_smiling:

Voici vite fait un exemple qui fonctionne (heu, je dis pas que c’est optimisé :slightly_smiling:), dans l’esprit du tien.

Le script à exécuter, présent dans /home/user/test.sh :

[code]#! /bin/bash

Script de test qui écrit, en boucle, “Coucou” dans le fichier coucou.txt après une seconde d’attente.

OUTPUT_FILE="/home/user/coucou.txt"

while [ 1 -lt 2 ]
do
sleep 1s && echo “Coucou” >> $OUTPUT_FILE
done

exit 0[/code]

Service présent dans /etc/init.d :

[code]#!/bin/sh

BEGIN INIT INFO

Provides: test

Required-Start: $local_fs $syslog

Required-Stop: $local_fs $syslog

Default-Start: 2 3 4 5

Default-Stop: 0 1 6

Short-Description: Start test daemon

END INIT INFO

. /lib/lsb/init-functions

SCRIPT_NAME=test.sh
SCRIPT=/home/user/$SCRIPT_NAME

test -x $SCRIPT || exit 5

case $1 in
start)
log_daemon_msg “Starting test service” "test"
start-stop-daemon --start --background --quiet --exec $SCRIPT
status=$?
log_end_msg $status
;;
stop)
log_daemon_msg “Stopping test service” "test"
start-stop-daemon --stop --quiet --oknodo --name $SCRIPT_NAME
log_end_msg $?
;;
restart|force-reload)
$0 stop && sleep 2 && $0 start
;;
try-restart)
if $0 status >/dev/null; then
$0 restart
else
exit 0
fi
;;
reload)
exit 3
;;
status)
status_of_proc $SCRIPT “test service”
;;
*)
echo "Usage: $0 {start|stop|restart|try-restart|force-reload|status}"
exit 2
;;
esac[/code]


Problème à la mise en place d'un daemon
#9

Si tu veux progresser en administration debian , c’est bien d’apprendre comment créer un script d’init :stuck_out_tongue:

Mais pour ta problématique y a plus simple et rapide (cf poste de piratebab)

En résumé, pourquoi vouloir faire compliqué :laughing:


#10

une solution encore non évoqué est l’utilisation de cron et son @startup


#11

C’est vrai qu’il y a 1 000 façons différentes de faire :slightly_smiling: C’est ça qu’est bon sur notre système favoris :041

En fait, je pense que tout dépend de ce que fait réellement son script. « post-up » est pas mal mais si la carte, pour une raison X ou Y, ne se « up » pas, le script sera-t-il exécuté ? « post-up », ainsi que « @startup » de Cron qui est aussi une bonne idée, ne permettent par ailleurs pas le {start|stop|restart}. Mais est-ce vraiment nécessaire dans son cas ? Bref, comme toujours, il y a des avantages et inconvénients :slightly_smiling:

Comme le disait agentsteel, pour la solution décrite ici, il serait peut-être mieux de « sourcer » son script dans /etc/rc.local (qui est géré par /etc/init.d/rc.local). Mais comme sous-entendait ce même agentsteel, que c’est bon de comprendre comment les choses fonctionnent :smiley: :wink:


#12

Si, comme je l’ai compris, ce script gère l’état des connexions d’une interface réseau, alors c’est un avantage que ce script ne démarre pas si la carte réseau n’arrive pas à s’activer …


#13

@piratebab : peut-être, mais à ce moment-là on préjuge de ce que xunil2003 veut faire (attention, je ne dis pas que c’est une mauvaise solution). On lui présente différentes solutions à son problème, et charge à lui de tester et choisir en conscience.

En effet, son script peut tout aussi bien tester l’état de la connexion (qui dépend donc également de l’état de la carte, active ou pas), et logger les erreurs. Dans ce cas, il est intéressant que le script soit lancé même en cas de problème d’activation de la carte. Sans compter qu’il peut aussi avoir plusieurs cartes à surveiller, ou que son script fait bien plus de choses qu’on le suppose :smiley:


#14

Bonjour,

Pyc : J’ai suivi votre exemple, tout marche correctement.

Contenu du service

[code]root@debian:~# cat /etc/init.d/eci
#!/bin/sh

BEGIN INIT INFO

Provides: test

Required-Start: $local_fs $syslog

Required-Stop: $local_fs $syslog

Default-Start: 2 3 4 5

Default-Stop: 0 1 6

Short-Description: Start test daemon

END INIT INFO

. /lib/lsb/init-functions

SCRIPT_NAME=eci.sh
SCRIPT=/home/serveur/bash/demarrage/$SCRIPT_NAME

test -x $SCRIPT || exit 5

case $1 in
start)
log_daemon_msg "Starting $SCRIPT_NAME"
start-stop-daemon --start --background --quiet --exec $SCRIPT
status=$?
log_end_msg $status
;;
stop)
log_daemon_msg "Stopping $SCRIPT_NAME"
start-stop-daemon --stop --quiet --oknodo --name $SCRIPT_NAME
log_end_msg $?
;;
restart|force-reload)
$0 stop && sleep 2 && $0 start
;;
try-restart)
if $0 status >/dev/null; then
$0 restart
else
exit 0
fi
;;
reload)
exit 3
;;
status)
status_of_proc $SCRIPT “test $SCRIPT_NAME”
;;
*)
echo "Usage: $0 {start|stop|restart|try-restart|force-reload|status}"
exit 2
;;
esac

root@debian:~# [/code]

Maintenant il me reste plus qu’à ajouter le service au démarrage de l’ordinateur (au boot) :

piratebab : Mon script test l’état de la connexion d’internet tous les x temps. si pas de connexion, il l’inscrit dans un fichier txt, si la connexion est fonctionnelle, ne rien faire. L’avantage d’utiliser le stop et start et de stopper le service pour changer le temps entre chaque test de connexion et de le démarrer. Cela me permet d’écrire à mon FAI et de lui indiquer les dates et heures auquel je n’avais pas de connexion internet.

Mon script :

[code]root@debian:~# cat /home/serveur/bash/demarrage/eci.sh
#!/bin/bash
#---------- Configuration ----------#
machine="78.xxx.xx.xx"
temps=300 # 5 minutes

5 minutes : 60 x 5 = 300

15 minutes : 60 x 15 = 900

30 minutes : 60 x 15 = 1800

45 minutes : 60 x 15 = 2700

1 heure : 60 x 15 = 3600

annee=$(date +%Y) # année

#---------- Script ----------#
while [ 1 ]; do
sleep $temps
date=$(date +%d/%m/%Y) #jouur
heure=$(date +%H:%M:%S) #heure
ping -c 1 “$machine” > /dev/null
if [ echo $? -eq 0 ]; then
#echo "$date $heure : Connexion internet accessible."
echo ""
else
#echo "$date $heure : Pas de connexion internet disponible, contacter votre FAI."
echo “$date $heure : Pas de connexion internet disponible.” >> /home/serveur/Rapports/$annee-etat-connxion-internet.txt
fi
done;

root@debian:~#[/code]

Merci à tous.


#15

Cool :wink:

Pense à cliquer sur la coche verte pour marquer le sujet comme résolu.


#16

Bonjour,

Voila je l’ai ajouté au demarrage.

root@debian:~# update-rc.d eci defaults update-rc.d: using dependency based boot sequencing insserv: script service-amule-daemon: service amule-daemon already provided! insserv: warning: script 'firewall' missing LSB tags and overrides root@debian:~#

Je comprends ce que veux dire piratebab.
Il est vrai que si mon script détecté l’état de la connexion par lip public, le problème reste que si le box est redémarré, le script va croire qu’il n’y a plus internet. ors il y aura toujours internet.

Alors comment faire ?
piratebab Je ne vois pas comment utiliser post-up dans mon script ?

Merci.


#17

post-up s’utilise dans le fichier interfaces, qui défini la configuration des interfaces réseau.
Il sert par exemple à lancer un script une fois que l’interface est up.
Ca ne s’utilise pas dans un script.