En ce moment, mon ordinateur portable commence à avoir ce que je pense, des problèmes matériels. Parfois, je dois essayer 3 fois avant que cela commence avec succès. J'essaie de sauvegarder le code que je modifie dans ma clé USB mais parfois, j'oublie. C'est pourquoi je me demande s'il existe un moyen d'exécuter un script lorsque l'utilisateur souhaite éteindre l'ordinateur. Ce script vérifiera plusieurs choses et selon la situation, il annulera l’arrêt et demandera à l’utilisateur d’effectuer une action (insérer une clé usb par exemple), ou d’exécuter certaines instructions (enregistrer au format usb) et autoriser le arrêt après. En raison de cette interaction nécessaire avec l'utilisateur, le simple fait de placer le script sous /etc/rc0.d ne suffira pas.
Merci
Message original se trouve dans la section ci-dessous et explique comment intercepter la commande /sbin/shutdown
. Cette section est basée sur inhibiteurs de systemd .
systemd-inhibit - Exécute un programme avec un blocage d'inhibition pris
systemd-inhibit [OPTIONS...] [COMMAND] [ARGUMENTS...]
systemd-inhibit [OPTIONS...] --list
systemd-inhibit peut être utilisé pour exécuter un programme avec un verrouillage d'arrêt, de veille ou d'inhibition inactif. Le verrou sera acquis avant l'exécution de la ligne de commande spécifiée, puis libéré.
Les verrouillages d'inhibiteurs peuvent être utilisés pour bloquer ou retarder les demandes de mise en veille et d'arrêt du système, ainsi que le traitement automatique en mode veille du système d'exploitation. Ceci est utile pour éviter que le système suspende pendant l'enregistrement d'un disque optique ou pour des opérations similaires qui ne doivent pas être interrompues.
Pour plus d'informations, voir Documentation du développeur sur le verrouillage d'inhibiteur .
Les options suivantes sont comprises:
--what=
--who=
--why=
--mode=
--list
-h
, --help
--version
Retourne le statut de sortie du programme exécuté.
# systemd-inhibit wodim foobar.iso
Ceci grave l’image ISO foobar.iso sur un CD en utilisant wodim (1) . Remarque: le lien est rompu dans la documentation de systemd et empêche la mise en veille, l’arrêt et la veille du système.
En concept, cela semble assez facile. Recherchez simplement la commande, renommez-la et remplacez-la par votre propre script qui appelle la version renommée:
$ type -a shutdown
shutdown is /sbin/shutdown
$ Sudo mv /sbin/shutdown /sbin/shutdownoriginal
Ensuite, éditez votre propre script dans /sbin/shutdown
contenant au minimum:
#!/bin/bash
/sbin/shutdownoriginal
Marquez ensuite votre script comme exécutable pour tout le monde:
$ Sudo chmod a+x /sbin/shutdown
Voila! Tout ce qui appelle shutdown appelle maintenant votre script qui appelle ensuite la commande originale.
En réalité, au moment où votre script est appelé, les choses peuvent ne pas être dans l'état que vous attendez. Par exemple, je mets quelques commandes pour enregistrer l'arrêt mais elles ne semblent pas fonctionner:
echo "/sbin/shutdown custom script calling /sbin/shutdownoriginal"
shutdowntime=`date`
echo "Last shutdown: $shutdowntime" >> /home/rick/shutdownlog.txt
Le premier echo
aurait dû apparaître dans /var/log/syslog
mais ce n’était pas le cas. Le second echo
aurait dû ajouter une ligne au fichier journal, mais ce n’était pas le cas. Cela me dit que lorsque la commande /sbin/shutdown
est exécutée, la journalisation système est déjà désactivée et le système d'E/S sur fichier est arrêté.
Une meilleure approche consisterait à examiner les inhibiteurs d’entrée et de cible d’arrêt de systemd. Je laisserai cette réponse ici, mais pour les autres qui pourraient penser que cela pourrait/devrait/devrait fonctionner.
Comme toujours, rappelez-vous YMMV - Y notre M ileage M ay V ery.
J'ai regardé systemd-inhibit
Ce que j'ai compris, c'est que lorsque vous l'utilisez avant une commande, elle attend que votre commande/script se termine avant que le système ne s'éteigne. Il existe quelques options pour bloquer l'arrêt, mais cela ne m'a pas semblé évident de le faire. Pour le moment, votre première suggestion fonctionne pour moi (cela ne me dérange pas de taper "shutdown" à la place de l'interface graphique). Voici un script de base à titre d'exemple:
#!/bin/bash
if [ ! -d /media/myusername/myusbname ]; then
zenity --question --text "Are you sure you want to shutdown without saving? If not choose \"No\" and insert the usb key" 2> /dev/null
answer=$?
else
#save data
answer=0
fi
if [ $answer -eq 0 ]; then
/sbin/shutdownoriginal
else
zenity --info --text="Shutdown canceled" 2> /dev/null
fi
Je vous remercie