Exécuter un script avant d'arrêter Debian 9

Venez nous en parler, c'est ici que l'on vous conseillera !
JMarc
Messages : 7
Inscription : dim. 27 nov. 2016, 14:15
Distribution : Debian

Exécuter un script avant d'arrêter Debian 9

Message par JMarc » mer. 06 déc. 2017, 21:53

A l'extinction de mon poste sous Debian 9 j'aimerais lancer le script de sauvegarde placé dans /etc/init.d à cet effet. Je suppose qu'il faut au préalable, du réseau, le système de fichier local et le système distant (un sshfs), ce qui se trouve dans les rubriques correspondantes de l'en-tête du script.

Code : Tout sélectionner

#!/bin/bash
### BEGIN INIT INFO
# Provides:          backup
# Required-Start:    $network $local_fs $remote_fs
# Required-Stop:     $network $local_fs $remote_fs
# Default-Start:     0
# Default-Stop:      
# Should-Start:      
# Should-Stop:       
# Short-Description: start backupZ script
### END INIT INFO


# Etablir liste de fichiers modifiés il y moins de n jour (s)
find /home/ -mtime -1 -type f > /tmp/listMAJ

# Créer archive compressée à partir de cette liste et chiffre le document

tar -cjvf /tmp/backup.tar.bz2 -T /tmp/listMAJ

# Se connecter au serveur
mount /media/zdisk 2> /dev/null

# Temporisation pour établir la liaison
sleep 5

# Vérifier sa présence

if [ ! -e "/media/zdisk/test" ]
   then
      (echo 'Pas se serveur en ligne - arret du script'; date) >> /var/log/backup.log
   exit
fi

# Lance le transfert

mv -f /tmp/backup.tar.bz2 /media/zdisk/

umount /media/zdisk
Selon divers sites consultés il convient ensuite de créer le lien symbolique dans le rc.d du niveau de fonctionnement (runlevel) demandé, à l'aide de :

Code : Tout sélectionner

sudo update-rc.d backupZ defaults 
Le script apparaît alors bien dans rc0.d avec le préfixe @S01 mais ne s'exécute pas...

Qu'est ce que j'ai raté ?

Merci pour vos lumières

Avatar de l’utilisateur
juice
Messages : 212
Inscription : dim. 29 juin 2008, 10:06
Distribution : Archlinux
Niveau : Confirmé
Localisation : Oberentzen

Re: Exécuter un script avant d'arrêter Debian 9

Message par juice » jeu. 07 déc. 2017, 00:37

Bonjour.

Ne faudrait-il pas passer les commandes d’exécution par les fonctions start | stop etc. ? comme pour
les autres services ?

Pour la sauvegarde j’ai personnellement une préférence pour rsync.

JMarc
Messages : 7
Inscription : dim. 27 nov. 2016, 14:15
Distribution : Debian

Re: Exécuter un script avant d'arrêter Debian 9

Message par JMarc » jeu. 07 déc. 2017, 08:25

Bonjour,

J'utilise également rsync de manière locale pour synchroniser deux arborescences de dossiers. Mais dans le cas présent il s'agit de transférer une archive par jour vers un site distant ; c'est pour cette raison que j'ai opté pour la commande mv.
Quant aux fonctions start|stop de la séquence de boot de systemd, j'avais compris qu'elles étaient définies dans les lignes Default-Start et Default-Stop de l'en-tête du script.

Avatar de l’utilisateur
juice
Messages : 212
Inscription : dim. 29 juin 2008, 10:06
Distribution : Archlinux
Niveau : Confirmé
Localisation : Oberentzen

Re: Exécuter un script avant d'arrêter Debian 9

Message par juice » ven. 08 déc. 2017, 00:26

OK. Il se pourrait que la ligne # Required-Start soit à laisser vide car le script n’est lancé qu’au shutdown.

Le nom de ton script et de # Provide ne sont pas en concordance :

sudo update-rc.d backupZ defaults et # Provides: backup

Cela aurait-il une incidence ? Regarde les autres scripts pour voir comment ils sont faits.

JMarc
Messages : 7
Inscription : dim. 27 nov. 2016, 14:15
Distribution : Debian

Re: Exécuter un script avant d'arrêter Debian 9

Message par JMarc » ven. 08 déc. 2017, 10:49

De fait, il n'y a que des scripts K01 (kill) dans rc0.d... et donc mon script S01backupZ n'y avait probablement pas sa place.

Voici par exemple celui du daemon du scanner que l'on trouve au démarrage ( rc 2 3 4 5.d) et à l'arrêt (rc 0 1 6.d)
Mais je n'y comprends pas tout...

Code : Tout sélectionner

#! /bin/sh
#
### BEGIN INIT INFO
# Provides:          saned
# Required-Start:    $syslog $local_fs $remote_fs
# Required-Stop:     $syslog $local_fs $remote_fs
# Should-Start:      dbus avahi-daemon
# Should-Stop:       dbus avahi-daemon
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: SANE network scanner server
# Description:       saned makes local scanners available over the
#                    network.
### END INIT INFO

. /lib/lsb/init-functions

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/sbin/saned
NAME=saned
DESC="SANE network scanner server"

test -x $DAEMON || exit 0

RUN=no
RUN_AS_USER=saned

# Get lsb functions
. /lib/lsb/init-functions

# Include saned defaults if available
if [ -f /etc/default/saned ] ; then
    . /etc/default/saned
fi

if [ "x$RUN" != "xyes" ] ; then
    log_success_msg "$NAME disabled; edit /etc/default/saned"
    exit 0
fi

DAEMON_OPTS="-a $RUN_AS_USER"

set -e

case "$1" in
  start)
	log_daemon_msg "Starting $DESC" "$NAME"
	start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \
		--exec $DAEMON -- $DAEMON_OPTS
	log_end_msg $?
	;;
  stop)
	log_daemon_msg "Stopping $DESC" "$NAME"
	start-stop-daemon --stop --oknodo --quiet --pidfile /var/run/$NAME.pid \
		--retry --exec $DAEMON
	log_end_msg $?
	;;
  force-reload)
	# check whether $DAEMON is running. If so, restart
	start-stop-daemon --stop --test --quiet --pidfile \
		/var/run/$NAME.pid --exec $DAEMON \
	&& $0 restart \
	|| exit 0
	;;
  restart)
	log_daemon_msg "Restarting $DESC" "$NAME"
	$0 stop
	$0 start
	;;
  status)
	if [ -s /var/run/$NAME.pid ]; then
            RUNNING=$(cat /var/run/$NAME.pid)
            if [ -d /proc/$RUNNING ]; then
                if [ $(readlink /proc/$RUNNING/exe) = $DAEMON ]; then
                    log_success_msg "$NAME is running"
                    exit 0
                fi
            fi

            # No such PID, or executables don't match
            log_failure_msg "$NAME is not running, but pidfile existed"
            rm /var/run/$NAME.pid
            exit 1
        else
            rm -f /var/run/$NAME.pid
            log_failure_msg "$NAME not running"
            exit 1
        fi
	;;
  *)
	N=/etc/init.d/$NAME
	log_failure_msg "Usage: $N {start|stop|restart|force-reload}"
	exit 1
	;;
esac

Avatar de l’utilisateur
juice
Messages : 212
Inscription : dim. 29 juin 2008, 10:06
Distribution : Archlinux
Niveau : Confirmé
Localisation : Oberentzen

Re: Exécuter un script avant d'arrêter Debian 9

Message par juice » dim. 10 déc. 2017, 12:33

Je mettrai le 0 sur # Default-Stop: et tu auras un script en K… et plus en S ce qui serait plus cohérent.
Ensuite assure toi que le # Provides: corresponde au nom de ton script. En l’occurence backupZ et non backup.

Si ça coince encore on pourrait envisager un repli sur systemd puisque la Debian 9 le supporte.

Répondre