Cron: rendre un script exécutable dès le démarrage Le sujet est résolu

Demande d'aide : c'est ici.
Répondre
tony
Membre actif
Membre actif
Messages : 526
Inscription : 10 juil. 2023, 00:54
Status : Hors-ligne

salut,
la méthode que j'utilise actuellement est de rentrer le script dans le fichier .bashrc. Ça fonctionne très bien. J'ai essayé de trouver une autre méthode qui laisse le script= fichier "pod", dans mon répertoire personnel tout en gardant les mêmes propriétés: exécution quelque soit le terminal et quelque soit la session. Normalement son exécution est initiée par la commande "pod", nom du fichier shell exécutable
Internet m'a proposé une solution simple pour exécuter un script au démarrage, avec une tâche pilotée par le service "cron":

Code : Tout sélectionner

crontab -e
@reboot . pod [ pod remplace un "script.sh" ] > /tmp/log 2&1 
pas d'erreur rapportée dans tmp/log mais aucune exécution apparente, même si j'enlève la redirection ">". De plus, le script n'est pas "sourcé" et ne s'exécute pas dans un terminal. Si je remplace "." par "source", même si ça ne répond pas à ma question, une erreur est enregistrée dans /tmp/log: "source" est inconnu.
Debian Trixie/ Xfce
Avatar de l’utilisateur
diesel
Membre
Membre
Messages : 362
Inscription : 29 oct. 2022, 22:43
Status : En ligne

Ben..., il suffit que ton fichier (dans ton répertoire personnel), soit exécutable.

Ensuite, dans le menu de ton gestionnaire de bureau, tu dois avoir une ligne : "applications au démarrage" (ou quelque chose d'approchant). Là, tu ajoutes ton script (avec son chemin complet : /home/moi/...) et le tour est joué.

Par contre, il faut que ton script commence par un shebang qui lui donne le type d'interpréteur à utiliser (par exemple, pour bash, il te faut comme première ligne : "#!/bin/bash").

Amicalement.

Jean-Marie
tony
Membre actif
Membre actif
Messages : 526
Inscription : 10 juil. 2023, 00:54
Status : Hors-ligne

je n'avais jamais pensé à utiliser cette application, mais je vais quand même essayer de comprendre pourquoi ma commande qui utilise le service cron ne fonctionne pas, le service lui même étant bien disponible:

Code : Tout sélectionner

cron.service - Regular background program processing daemon
     Loaded: loaded (/usr/lib/systemd/system/cron.service; enabled; preset: enabled)
     Active: active (running) since Sun 2026-04-19 23:56:50 CEST; 8h ago
 Invocation: f20752307acd48c29d6cf480bf117080
       Docs: man:cron(8)
   Main PID: 913 (cron)
      Tasks: 1 (limit: 18579)
     Memory: 2.3M (peak: 4.3M)
        CPU: 99ms
     CGroup: /system.slice/cron.service
             └─913 /usr/sbin/cron -f
PS: je vais aussi renommer mon fichier shell pod, po.sh. Je viens de réaliser que l'extension .sh doit servir à l'identifier en tant que script au 1er coup d'œil.
Debian Trixie/ Xfce
Avatar de l’utilisateur
diesel
Membre
Membre
Messages : 362
Inscription : 29 oct. 2022, 22:43
Status : En ligne

Bah..., pour le système, un nom de fichier, ben..., c'est un nom de fichier. Peu importe les caractères qu'il contient.

Aussi, "l'extension" .sh, c'est uniquement pour toi. Le système n'en fera rien du tout. Au mieux, ton gestionnaire de bureau saura qu'elle application ouvrir pour l'éditer.

cron est fait pour déclencher des traitements à une heure donnée (voire répétitive), pas sur un évènement (démarrage, extinction...).

Amicalement.

Jean-Marie
tony
Membre actif
Membre actif
Messages : 526
Inscription : 10 juil. 2023, 00:54
Status : Hors-ligne

je me suis servi de ce site: https://phoenixnap.com/kb/crontab-reboot où ils écrivent ceci:
To run a cron job at every system boot, add a string called @reboot to the end of the task list. The job defined by this string runs at startup, immediately after Linux reboots.

Use the following syntax when adding a @reboot string:

@reboot [path to command] [argument1] [argument2] … [argument n]
@reboot [part to shell script]
Debian Trixie/ Xfce
Avatar de l’utilisateur
diesel
Membre
Membre
Messages : 362
Inscription : 29 oct. 2022, 22:43
Status : En ligne

Effectivement, je ne m'étais jamais servi de cette définition "@reboot".

Cela dit, je ne sais pas ce que tu veux faire avec ce script et à quel moment tu veux qu'il s'exécute (au tout début du démarrage de la machine, lorsque l'interface graphique est active, lorsque tu te logues...).

le "@reboot" de cron doit déclencher la tâche très tôt dans le cycle de démarrage, probablement bien avant que l'interface graphique soit activée et je ne suis pas certain que ce soit ce que tu veuille.

Amicalement.

Jean-Marie
tony
Membre actif
Membre actif
Messages : 526
Inscription : 10 juil. 2023, 00:54
Status : Hors-ligne

je veux que le script ait la même disponibilité que si je le place dans le fichier .bashrc: doit s'exécuter dans tout terminal et n'importe quand une fois la session commencée. D'après ce que j'ai compris, le fichier .bashrc est lu et exécuté ligne par ligne à chaque démarrage et à chaque changement de terminal, ce qui expliquerait pourquoi un script dans ce fichier soit dispo n'importe quand.

Comme support de sauvegardes j'utilise, entre autres, un ssd externe qui comporte un Debian 13 de secours. Lorsque je le branche sur mon portable je dois monter 2 partitions supports des sauvegardes, réaliser ces sauvegardes, puis déconnecter ce ssd. Je le démonte, mais alors je n'ai plus accès à "retirer le périphérique en toute sécurité" ou "éjecter", ce qui coupe son alimentation. C'est à ce moment que mon script doit intervenir pour couper son alimentation avant de le débrancher.

Quant à crontab je viens d'essayer cette commande:

Code : Tout sélectionner

@reboot sleep 60 && /home/<user>/po.sh
, en vain. Mais je me demande si ça suffit pour qu'un écran de terminal avec le résultat du déroulement du script apparaisse de lui-même, peut-être qu'il me faudrait ajouter une autre commande, que j'ai oubliée, pour utiliser un mini écran de terminal qui affichera le déroulement du script (ci-dessous)

Code : Tout sélectionner

#!/bin/bash

pod()
{
lsblk
read -r -p "x :" x
y="/dev/"$x
udisksctl power-off -b "$y"
}
PS: j'ai retrouvé la commande en question

Code : Tout sélectionner

DISPLAY=:0 xterm -e 
Debian Trixie/ Xfce
tony
Membre actif
Membre actif
Messages : 526
Inscription : 10 juil. 2023, 00:54
Status : Hors-ligne

je laisse de côté, pour l'instant, la solution qui utilise le service cron. J'ai modifié mon fichier shell pour qu'il soit exécutable avec la commande bash; plus besoin de sourcer quoi que ce soit,

Code : Tout sélectionner

bash po.sh
exécute la commande recherchée:

Code : Tout sélectionner

:~$ cat po.sh 
#!/bin/bash

# Define the function
pod()
{
lsblk
read -r -p "x :" x
y="/dev/"$x
udisksctl power-off -b "$y"
}

# Call the function
pod

:~$ bash po.sh 
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
nvme0n1     259:0    0 476.9G  0 disk 
├─nvme0n1p1 259:1    0   512M  0 part /boot/efi
├─nvme0n1p2 259:2    0  27.9G  0 part /
├─nvme0n1p3 259:3    0   977M  0 part [SWAP]
└─nvme0n1p4 259:4    0 447.5G  0 part /home
x :
Merci pour les renseignements apportés.
Debian Trixie/ Xfce
Répondre