Juliettead
Posts: 9
Joined: Tue Aug 13, 2019 2:43 pm

Crontab

Thu Sep 26, 2019 2:14 pm

Bonjour,
Je rencontre un problème, j'essaie de faire un script qui modifie le fichier crontab de l'utilisateur à partir d'un fichier texte. Il a pour but de simplifier la tâche à des personnes ne connaissant pas la commande. Mais malheureusement après l’exécution du script les modifications n'on pas l'air d'être prit en compte. Merci pour avance pour votre aide.

Le script en question:
sudo mv /var/spool/cron/crontabs/pi /var/spool/cron/crontabs/pi_backup
sudo touch /var/spool/cron/crontabs/pi
sudo chmod 777 /var/spool/cron/crontabs/pi
cat /home/pi/sd/assistance/copie_crontab > /var/spool/cron/crontabs/pi
sudo /etc/init.d/cron restart
echo -e '\033[32mMise à jour effectuée '
sleep 5
sudo reboot -f

epoch1970
Posts: 4250
Joined: Thu May 05, 2016 9:33 am
Location: Paris, France

Re: Crontab

Thu Sep 26, 2019 5:47 pm

sudo est une commande interactive, à utiliser pour lancer le script, pas à l'intérieur du script.
sudo peut être configuré pour ne pas demander de mot de passe lors de l'exécution de certaines commandes. Un nom de script, par exemple.

Avec un système dérivé de Debian, déposer un fichier dans /etc/cron.d est plus sûr que de bricoler dans /var/spool sans accès exclusif.
"reboot -f" est un peu violent peut-être...
"S'il n'y a pas de solution, c'est qu'il n'y a pas de problème." Les Shadoks, J. Rouxel

JumpZero
Posts: 1050
Joined: Thu Mar 28, 2013 7:35 pm
Location: 127.0.0.1

Re: Crontab

Thu Sep 26, 2019 6:03 pm

epoch1970 wrote:
Thu Sep 26, 2019 5:47 pm
"reboot -f" est un peu violent peut-être...
+1 effectivement violent et il ne semble pas utile de rebooter
D'autre part pourquoi faire ce script alors que la commande crontab permet de faire ça simplement

Code: Select all

crontab [ -u user ] file
lire le manuel de crontab pour plus de détails

Code: Select all

 man crontab

Juliettead
Posts: 9
Joined: Tue Aug 13, 2019 2:43 pm

Re: Crontab

Sun Sep 29, 2019 11:52 am

Bonjour,
Merci pour vos réponses. J'ai bien conscience qu'utiliser la commande crontab -e conçue à cette effet serais plus simple que faire un script. Cependant je compte faire évoluer ce script pour qu'il soit interactif, c'est à dire qu'il demande le nom du script ou des commandes à lancer, ainsi que la période. C'est pour ça que je veux modifier directement le fichier lié à l'utilisateur. Le script est dédié à des personnes ne sachant pas utiliser linux je compte également le lié à un alias. La commande sudo reboot -f était juste un test pourvoir si le reboot de linux changerais quelque chose.

nikotinux
Posts: 707
Joined: Sat Feb 02, 2013 2:11 am

Re: Crontab

Sun Sep 29, 2019 5:57 pm

ça existe déjà en veux-tu en voila !!

par exemple
https://github.com/alseambusher/crontab-ui

Juliettead
Posts: 9
Joined: Tue Aug 13, 2019 2:43 pm

Re: Crontab

Sun Sep 29, 2019 6:33 pm

Merci à toi pour le lien github, je vais y jeter un coup d’œil cependant j'aurais bien aimer comprendre pourquoi mon script ne fonctionne pas.

nikotinux
Posts: 707
Joined: Sat Feb 02, 2013 2:11 am

Re: Crontab

Sun Sep 29, 2019 8:09 pm

Ce n'est pas parce que des programmes équivalents existent déjà qu'ils vont répondre exactement a ce que tu souhaites faire. Ce sont sûrement de très bonnes sources d'inspiration.Si les auteurs ont choisi de les publier sous licence libre, c'est aussi un peu pour ça ...

epoch1970
Posts: 4250
Joined: Thu May 05, 2016 9:33 am
Location: Paris, France

Re: Crontab

Sun Sep 29, 2019 8:56 pm

Juliettead wrote:
Sun Sep 29, 2019 6:33 pm
Merci à toi pour le lien github, je vais y jeter un coup d’œil cependant j'aurais bien aimer comprendre pourquoi mon script ne fonctionne pas.
Les réponses jusqu'à présent n'étaient peut être pas assez claires...
  1. sudo = niet à l'intérieur d'un script sauf configuration spécifique de /etc/sudoers.
    man sudoers wrote:EXAMPLES
    Below are example sudoers file entries.
    ...
    # Host alias specification
    Host_Alias CDROM = orion, perseus, hercules
    ...
    ALL CDROM = NOPASSWD: /sbin/umount /CDROM,\
    /sbin/mount -o nosuid\,nodev /dev/cd0a /CDROM

    Any user may mount or unmount a CD-ROM on the machines in the CDROM Host_Alias (orion, perseus, hercules) without entering a password. This is a bit tedious for users to type, so it is a prime candidate for encapsulating in a shell script.
  2. /var/spool/ = niet sans accès protégé via un programme, ex. "crontab -e"
    man cron wrote:cron searches its spool area (/var/spool/cron/crontabs) for crontab files (which are named after accounts in /etc/passwd); crontabs found are loaded into memory.
    Note that crontabs in this directory should not be accessed directly - the crontab command should be used to access and update them.
  3. Sous Debian, /etc/cron.d/ fait exactement ce que tu veux. Tu peux y ajouter ou enlever des tâches sans aucun risque.

    Code: Select all

    $ ls /etc/cron.d/
    anacron  mdadm  popularity-contest
    
    $ cat /etc/cron.d/popularity-contest 
    SHELL=/bin/sh
    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
    26 6 * * *   root    test -x /etc/cron.daily/popularity-contest && /etc/cron.daily/popularity-contest --crond
Tout ça expliqué en détail dans "man cron" et "man sudo" sur ta machine.
"S'il n'y a pas de solution, c'est qu'il n'y a pas de problème." Les Shadoks, J. Rouxel

nikotinux
Posts: 707
Joined: Sat Feb 02, 2013 2:11 am

Re: Crontab

Sun Sep 29, 2019 10:34 pm

si tu insistes avec ton script

ligne 1 le mv doit se faire en dehors de /var/spool/cron/crontabs/
ligne 2 et 3 ne servent a rien puisque tu écrases le fichier en ligne 4

il faut ensuite faire chmod 600 et chown pi:crontab sur ledit fichier

il faut prendre l'habitude d'utiliser systemctl pour gérer les services

JumpZero
Posts: 1050
Joined: Thu Mar 28, 2013 7:35 pm
Location: 127.0.0.1

Re: Crontab

Mon Sep 30, 2019 8:22 am

+1 pour utiliser systemctl pour gérer les services
Depuis Jessie (donc il y a longtemps) "systemd" remplace "system V"
ta commande

Code: Select all

/etc/init.d/cron restart
est à remplacer par

Code: Select all

systemctl restart cron
du coup inutile de rebooter puisque cron est relancé.
Encore mieux il est inutile de relancer cron, il saura qu'un fichier a été modifié, comme le dit le manuel:

Code: Select all

man cron
Additionally, cron checks each minute to see if its spool directory's modtime (or the mod‐
time on the /etc/crontab file) has changed, and if it has, cron will then examine the mod‐
time on all crontabs and reload those which have changed. Thus cron need not be restarted
whenever a crontab file is modified.

Juliettead
Posts: 9
Joined: Tue Aug 13, 2019 2:43 pm

Re: Crontab

Mon Sep 30, 2019 11:13 am

Bonjour,
En appliquant vos conseil j'ai modifié mon script, cepedant les script que je veux lancer ne se lance toujours pas est-ce parce-que je mv le fichier initial ? Le reboot du service était juste un test pour voir si ça marchais en redémarrant le service.

Code: Select all

mv /etc/crontab /etc/crontab_backup
cat /home/pi/sd/assistance/copie_crontab > /etc/crontab
systemctl restart cron

JumpZero
Posts: 1050
Joined: Thu Mar 28, 2013 7:35 pm
Location: 127.0.0.1

Re: Crontab

Mon Sep 30, 2019 1:18 pm

Dans ton premier post tu voulais modifier la crontab utilisateur : /var/spool/cron/crontabs/pi
Maintenant c'est la crontab système : /etc/crontab
les 2 n'ont pas exactement la même stucture, la crontab système a un nom d'utilisateur en +

Code: Select all

[email protected]:~ $cat /etc/crontab 
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed
Poste le contenu de ton fichier /home/pi/sd/assistance/copie_crontab
Pour voir s'il est ok.
Tu peux aussi regarder dans /var/log/syslog pour trouver les erreurs que cron génère.

Juliettead
Posts: 9
Joined: Tue Aug 13, 2019 2:43 pm

Re: Crontab

Mon Sep 30, 2019 1:43 pm

Bonjour,
Voici le contenue de copie_crontab

Code: Select all

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user	command
17 *	* * *	root    cd / && run-parts --report /etc/cron.hourly
25 6	* * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6	* * 7	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6	1 * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
12 	*/1 * * pi 	sudo reboot -f
#
Le fichier syslog faisant 247 634 ligne je met que les événement crontab pour la date d'aujourd'hui

Code: Select all

Sep 30 14:45:01 Portier-214 CRON[26305]: (pi) CMD (sudo killall java)
Sep 30 14:47:01 Portier-214 CRON[29489]: (pi) CMD (sudo killall badge)
Sep 30 14:47:01 Portier-214 CRON[29485]: (CRON) info (No MTA installed, discarding output)
Sep 30 15:09:01 Portier-214 CRON[2117]: (root) CMD (  [ -x /usr/lib/php5/sessionclean ] && /usr/lib/php5/sessionclean)
Les événement 45 et 47 minutes sont liés au fichier crontab de pi que j'ai modifiée avec un crontab -e

epoch1970
Posts: 4250
Joined: Thu May 05, 2016 9:33 am
Location: Paris, France

Re: Crontab

Mon Sep 30, 2019 1:50 pm

Mieux vaut ne pas toucher à /etc/crontab qui ne fait par défaut qu'exécuter les tâches dans /etc/crond.hourly, .weekly, .monthly.

En particulier :
  • Code: Select all

    mv /etc/crontab /etc/crontab_backup
    Pistolet à un coup: si crontab_backup existe déjà, il y aura une erreur (et pas de backup)
  • Code: Select all

    cat /home/pi/sd/assistance/copie_crontab > /etc/crontab
    Si pour une raison quelconque le cat foire, on obtient un fichier système crontab vide. Fini les /etc/crond.hourly, .weekly, .monthly...
  • Code: Select all

    systemctl restart cron
    Inutile, comme déjà dit
Rajouter/enlever un fichier dans /etc/cron.d/ (dans le même format que /etc/crontab) est plus sûr. Non testé :

Code: Select all

cp -f /home/pi/sd/assistance/ma_tache /etc/cron.d/ && \
	chown 0:0 /etc/cron.d/ma_tache && \
	chmod 644 /etc/cron.d/ma_tache
Si le fichier existe déjà, on l'écrase. Si la copie foire, rien d'autre ne foire et le système reste inchangé.
Les fichiers dans /etc/cron.d doivent appartenir à root, les 2 dernières commandes se chargent de ça.
"S'il n'y a pas de solution, c'est qu'il n'y a pas de problème." Les Shadoks, J. Rouxel

Juliettead
Posts: 9
Joined: Tue Aug 13, 2019 2:43 pm

Re: Crontab

Mon Sep 30, 2019 1:56 pm

Bonjour,
Concernant le /etc/crontab je me suis rendue compte en regardant le fichier copie_crontab que j'avais un *.
J'ai juste une petite question si je met un fichier dans le dossier cron.d peut-on contrôler sa "date" de lancement.

epoch1970
Posts: 4250
Joined: Thu May 05, 2016 9:33 am
Location: Paris, France

Re: Crontab

Mon Sep 30, 2019 2:00 pm

Concernant le "killall", c'est un peu brutal aussi. Quand killall dégaine tous les process qui ont un nom qui correspond plus ou moins tombent...
Il serait plus sûr de s'appuyer sur le PID (le numéro de process) des applications qui sont à flinguer. En général le PID est conservé dans /var/run (ou /run).

L'ami systemd s'occupe de ça en théorie, par ex. avec "systemctl restart ..."
Sinon

Code: Select all

[ -f /run/mon_pid] && kill $(cat /run/mon_pid)
est une possibilité.
"S'il n'y a pas de solution, c'est qu'il n'y a pas de problème." Les Shadoks, J. Rouxel

epoch1970
Posts: 4250
Joined: Thu May 05, 2016 9:33 am
Location: Paris, France

Re: Crontab

Mon Sep 30, 2019 2:01 pm

Juliettead wrote:
Mon Sep 30, 2019 1:56 pm
J'ai juste une petite question si je met un fichier dans le dossier cron.d peut-on contrôler sa "date" de lancement.
Lis la page de man. Et regarde les cron.d dans ta machine. Et celui que j'ai posté hier...
Oui /etc/crontab et les fragments cron.d c'est du kif.
Last edited by epoch1970 on Mon Sep 30, 2019 2:25 pm, edited 1 time in total.
"S'il n'y a pas de solution, c'est qu'il n'y a pas de problème." Les Shadoks, J. Rouxel

Juliettead
Posts: 9
Joined: Tue Aug 13, 2019 2:43 pm

Re: Crontab

Mon Sep 30, 2019 2:07 pm

epoch1970 wrote:
Mon Sep 30, 2019 2:00 pm
Concernant le "killall", c'est un peu brutal aussi. Quand killall dégaine tous les process qui ont un nom qui correspond plus ou moins tombent...
Il serait plus sûr de s'appuyer sur le PID (le numéro de process) des applications qui sont à flinguer. En général le PID est conservé dans /var/run (ou /run).

L'ami systemd s'occupe de ça en théorie, par ex. avec "systemctl restart ..."
Sinon

Code: Select all

[ -f /run/mon_pid] && kill $(cat /run/mon_pid)
est une possibilité.
On est plusieurs développeur sur la carte, c'est la première fois que je m'occupe de cette partie, c'est donc une découverte pour moi. Mais merci de vos conseil je vais voir si je peut récupérer le pid de la tache pour faire quelque chose d'un peut plus propre.

JumpZero
Posts: 1050
Joined: Thu Mar 28, 2013 7:35 pm
Location: 127.0.0.1

Re: Crontab

Mon Sep 30, 2019 2:47 pm

Juliettead wrote:
Mon Sep 30, 2019 1:43 pm
Bonjour,
Voici le contenue de copie_crontab

Code: Select all

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user	command
17 *	* * *	root    cd / && run-parts --report /etc/cron.hourly
25 6	* * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6	* * 7	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6	1 * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
12 	*/1 * * pi 	sudo reboot -f
#
Le fichier syslog faisant 247 634 ligne je met que les événement crontab pour la date d'aujourd'hui

Code: Select all

Sep 30 14:45:01 Portier-214 CRON[26305]: (pi) CMD (sudo killall java)
Sep 30 14:47:01 Portier-214 CRON[29489]: (pi) CMD (sudo killall badge)
Sep 30 14:47:01 Portier-214 CRON[29485]: (CRON) info (No MTA installed, discarding output)
Sep 30 15:09:01 Portier-214 CRON[2117]: (root) CMD (  [ -x /usr/lib/php5/sessionclean ] && /usr/lib/php5/sessionclean)
Les événement 45 et 47 minutes sont liés au fichier crontab de pi que j'ai modifiée avec un crontab -e
Oui lit encore la doc, les pages de man, et il y a beaucoup d'exemples sur le web.
Encore un truc bizarre dans ton post ci-dessus:
la dermière ligne de ton crontab système est:
12 */1 * * pi sudo reboot -f
Donc tu veux que le user pi reboot le systeme apparement toutes les heures à H+12minutes !!!! C'est chaud non?
De toute façon il y a une erreur puisqu'il n'y a que 4 champs alors qu'il devrait y en avoir 5: m h dom mon dow
Donc il y aurait du y avoir une erreur que l'on ne voit pas ton log, mais bon il y a peut-être un décalage.
Vas-y pas à pas!

Juliettead
Posts: 9
Joined: Tue Aug 13, 2019 2:43 pm

Re: Crontab

Mon Sep 30, 2019 6:05 pm

JumpZero wrote:
Mon Sep 30, 2019 2:47 pm
Juliettead wrote:
Mon Sep 30, 2019 1:43 pm
Bonjour,
Voici le contenue de copie_crontab

Code: Select all

# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user	command
17 *	* * *	root    cd / && run-parts --report /etc/cron.hourly
25 6	* * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6	* * 7	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6	1 * *	root	test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
12 	*/1 * * pi 	sudo reboot -f
#
Le fichier syslog faisant 247 634 ligne je met que les événement crontab pour la date d'aujourd'hui

Code: Select all

Sep 30 14:45:01 Portier-214 CRON[26305]: (pi) CMD (sudo killall java)
Sep 30 14:47:01 Portier-214 CRON[29489]: (pi) CMD (sudo killall badge)
Sep 30 14:47:01 Portier-214 CRON[29485]: (CRON) info (No MTA installed, discarding output)
Sep 30 15:09:01 Portier-214 CRON[2117]: (root) CMD (  [ -x /usr/lib/php5/sessionclean ] && /usr/lib/php5/sessionclean)
Les événement 45 et 47 minutes sont liés au fichier crontab de pi que j'ai modifiée avec un crontab -e
Oui lit encore la doc, les pages de man, et il y a beaucoup d'exemples sur le web.
Encore un truc bizarre dans ton post ci-dessus:
la dermière ligne de ton crontab système est:
12 */1 * * pi sudo reboot -f
Donc tu veux que le user pi reboot le systeme apparement toutes les heures à H+12minutes !!!! C'est chaud non?
De toute façon il y a une erreur puisqu'il n'y a que 4 champs alors qu'il devrait y en avoir 5: m h dom mon dow
Donc il y aurait du y avoir une erreur que l'on ne voit pas ton log, mais bon il y a peut-être un décalage.
Vas-y pas à pas!
Oui je me suis rendue compte de mon erreur, pour le reboot du system c'est juste un test pour voir si oui ou non le script fonctionne.

Return to “Français”