#1 Le 23/06/2014, à 14:57
- Gaara
Peut-on intégrer cron dans un script python?
Bonjour,
Je suis en train d'écrire un script qui prévoit de lancer une commande à une date programmée. Pour cela, je pense que le meilleur moyen d'y parvenir est d'utiliser cron.
Mais je rencontre plusieurs difficultés:
- Normalement, pour entrer une nouvelle tâche, on doit faire "crontab -e", or automatiser ça sous python me semble compliqué;
- est-il possible d'éditer le crontab sans passer par cette commande?
- pour modifier le fichier /etc/crontab (je pense que c'est ce fichier, je n'en suis pas certain), il faut être en root, or je me vois mal demander le mot de passe root pour mon logiciel (un "magnétoscope" TV)...
Donc si l'usage de cron n'est pas possible, le seul moyen est de laisser le script tourner en tâche de fond (daemon) et d'attendre la date pour déclencher la commande voulue.
Si quelqu'un a une idée
Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid
<code>zenity --question --title "Alert" --text "Microsoft Windows has been found! Would you like to remove it?"</code>
Hors ligne
#2 Le 23/06/2014, à 15:28
- yann_001
Re : Peut-on intégrer cron dans un script python?
Bonjour.
A moins que je ne me trompe, sous les systèmes Gnu/Linux il n'est pas possible à un logiciel de modifier le comportement d'un autre.
Il te faut donc éditer le fichier de configuration de cron pour qu'il lance le script.
Cela dit je peux me tromper.
Hors ligne
#3 Le 23/06/2014, à 15:51
- Gaara
Re : Peut-on intégrer cron dans un script python?
Merci de ta réponse
Oui c'est bien ce que je craignais...
Je crois que je vais user et abuser du time.sleep, sauf avis contraire !
Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid
<code>zenity --question --title "Alert" --text "Microsoft Windows has been found! Would you like to remove it?"</code>
Hors ligne
#4 Le 23/06/2014, à 15:53
- tiramiseb
Re : Peut-on intégrer cron dans un script python?
Salut,
Ce que certains logiciels font, c'est mettre une tâche cron très régulière (toutes les 5 minutes, voire toutes les minutes), cette tâche exécute un "méta-exécuteur de tâches" propre au logiciel, c'est alors lui qui décide d'exécuter quelque chose... ou rien du tout. Mais bon, c'est un peu crado.
Mais en fait, "crontab -e" n'est pas la seule manière de mettre en place un cron : tu peux exécuter crontab de la manière suivante :
crontab super-fichier.txt
Cron remplacera alors l'intégralité de ta crontab par le contenu du fichier super-fichier.txt.
Donc tu peux faire :
crontab -l > /tmp/super-cron
echo "0 0 * * * mon-super-job" >> /tmp/super-cron
crontab /tmp/super-cron
rm /tmp/super-cron
Ici c'est un exemple en shellscript, facile à transcrire en Python.
Attention par contre, là on ajoute un job, il te faudra peut-être en enlever : c'est alors à toi de prendre ça en compte dans ton programme en Python, en supprimant les lignes du fichier /tmp/super-cron.
Bien sûr, avec Python il est préférable d'utiliser tempfile pour un fichier temporaire.
-----
Et finalement, maintenant que tu as compris comment fonctionnent les choses ennuyeuses, tu peux te rappeler que Python c'est génial parce qu'il y a des milliers de modules disponibles, dont https://pypi.python.org/pypi/python-crontab !
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#5 Le 23/06/2014, à 15:55
- tiramiseb
Re : Peut-on intégrer cron dans un script python?
Je crois que je vais user et abuser du time.sleep, sauf avis contraire !
Arrrgggghhhhggglllllllll (je m'étrangle).
Non !!!
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#6 Le 23/06/2014, à 16:53
- Gaara
Re : Peut-on intégrer cron dans un script python?
Génial, merci beaucoup. (et désolé de t'avoir choqué!!)
Pour la première partie, si je comprend bien:
- le fichier "super-fichier.txt" contient ma commande
- le crontab se trouve dans /tmp, donc pas besoin de passer en root
- pour arrêter ma commande (à heure et date définie aussi), je dois créer un deuxième "super-fichier.txt" et programmer une seconde tâche
Pour la seconde partie, ça a l'air intéressant mais j'aimerais que mon logiciel soit portable (j'ai déjà un ppa d'actif), or ce module n'est pas dans les dépôts, donc:
- je peux l'insérer dans mon code ? (je n'ai jamais fait ça, mais je peux apprendre)
- ou créer un build pour compiler un deuxième paquet, qui sera dans le ppa?
Quelle sera selon toi la solution la plus facile à mettre en place?
Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid
<code>zenity --question --title "Alert" --text "Microsoft Windows has been found! Would you like to remove it?"</code>
Hors ligne
#7 Le 23/06/2014, à 18:23
- tiramiseb
Re : Peut-on intégrer cron dans un script python?
- le fichier "super-fichier.txt" contient ma commande
Non. Le fichier "super-fichier.txt" contient l'intégralité de la crontab qui est à mettre en place (toutes les lignes du fichier que tu peux éditer avec "crontab -e").
- le crontab se trouve dans /tmp, donc pas besoin de passer en root
Aucun rapport. Lorsque tu utilises la commande "crontab -e" en tant qu'utilisateur, ça crée un fichier temporaire dans /tmp ; c'est ce fichier qui est édité par ton éditeur. Et c'est ce fichier qui est réintégré dans le système lorsque tu fermes l'éditeur. L'emplacement du fichier temporaire créé par "crontab -e" importe peu.
- pour arrêter ma commande (à heure et date définie aussi), je dois créer un deuxième "super-fichier.txt" et programmer une seconde tâche
Ta commande ne s'arrête pas toute seule ?
Quoi qu'il en soit, si tu as deux commandes à exécuter, tu dois les renseigner les deux dans le fichier qui sera utilisé par crontab - dans mon exemple, "super-fichier.txt".
Si tu crées deux fichiers que tu ouvres avec la commande "crontab", le second remplacera le premier.
Pour la seconde partie, ça a l'air intéressant mais j'aimerais que mon logiciel soit portable
Ce qui est tout à ton honneur
- je peux l'insérer dans mon code ?
Oui tu peux. Ce n'est pas très compliqué : tu prends le module et tu le mets comme sous-répertoire du tien. Mais bon, c'est crado.
- ou créer un build pour compiler un deuxième paquet, qui sera dans le ppa?
Ce serait carrément le plus propre.
Quelle sera selon toi la solution la plus facile à mettre en place?
La plus facile serait la première.
La plus propre serait la seconde.
Il y en a également une troisième : télécharger le paquet avec pip ou éventuellement easy_install.
Quand on distribue un module Python, on peut y inclure un fichier (que l'on appelle généralement "requirements.txt"), dans lequel on définit les dépendances.
Ensuite on demande d'exécuter "pip install -r requirements.txt", ce qui téléchargera les modules qui vont bien sur le PyPI.
Je te conseillerais de toute manière d'intégrer ce requirements.txt, pour les autres distros, même si tu fais un paquet .deb... Parce que là tu parles de portabilité puis tu parles de PPA, qui sont spécifiques à Ubuntu...
Et pour aller encore plus loin, tu as aussi la possibilité de proposer d'utiliser virtualenv, comme cela se fait de plus en plus en Python, histoire que tout soit bien propre...
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#8 Le 23/06/2014, à 19:08
- Gaara
Re : Peut-on intégrer cron dans un script python?
Ben en fait, l'idée m'est venue quand j'ai essayé d'utiliser cvlc pour enregistrer une chaine HD de la télé d'orange. A ma grande surprise, ça à fonctionné, avec une qualité vidéo HD
cvlc -vvv rtp://@232.0.2.180:8200 --sout file/mkv:/home/guillaume/Vidéos/FR2.mkv
Mais j'arrête le truc avec <ctrl>+<c>. Donc je vais trouver un moyen de faire un kill process pour stopper le bouzin... (désolé si je te choque une fois de +)
Pour le moment, je fais ça pour moi (il a fallu que je retrouve cette commande un jour pour enregistrer un truc vite fait, ça m'a gonflé), mais si ça marche sur mon ordi, peut-être que ça pourrait rendre service à d'autres.
Mais c'est vrai que je me limite à Ubuntu et aux abonnés de la télé d'orange, pour le moment. Pour les gens d'Archlinux ou de Manjaro, je publie les sources ! Et pour Free et sfr, je pense que les adresse rtp sont différentes, il y a donc du boulot...
C'est à voir pour plus tard, éventuellement...
Bref, pour le crontab, je n'avais pas compris grand chose, c'est plus clair maintenant.
Pour la troisième solution, là, je dois avouer que c'est un peu trop pour moi. Quand à virtualenv... ça à l'air cool... pour un pro que je ne suis pas... Faudra avant que je me mette à python3...
De toutes façons je n'ai pas fini la partie graphique (je fais tout à la main, pas de glade), donc je ferais mes essais que dans quelques jours.
Voilà ce que ça donne pour le moment:
Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid
<code>zenity --question --title "Alert" --text "Microsoft Windows has been found! Would you like to remove it?"</code>
Hors ligne
#9 Le 23/06/2014, à 19:37
- tiramiseb
Re : Peut-on intégrer cron dans un script python?
Donc je vais trouver un moyen de faire un kill process pour stopper le bouzin... (désolé si je te choque une fois de +)
Non, c'est très bien un kill, c'est la procédure standard pour arrêter un processus. Il faut bien sûr utiliser le bon signal, éviter SIGKILL notamment...
Pour la troisième solution, là, je dois avouer que c'est un peu trop pour moi.
Pourtant, c'est plus simple que les deux autres...
Quand à virtualenv... ça à l'air cool... pour un pro que je ne suis pas...
Je ne suis pas un pro du Python. J'y suis allé avec beaucoup d'appréhension. En 10 minutes j'ai compris comment ça marche. Maintenant je l'utilise beaucoup...
Faudra avant que je me mette à python3...
Je vois pas le rapport...
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#10 Le 23/06/2014, à 20:30
- Gaara
Re : Peut-on intégrer cron dans un script python?
Nan mais la solution du paquet python-cron me plait bien, comme ça je vais approfondir mes connaissances en build sur Launchpad.
Et puis comme le dernier ppa qui le propose date de 2010, et n'a pas été mis à jour depuis, ça servira peut-être, si j'y arrive...
Merci pour ces infos, il n'y a que l’embarras du choix... Je me contenterais de la version "semi-portable"...
Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid
<code>zenity --question --title "Alert" --text "Microsoft Windows has been found! Would you like to remove it?"</code>
Hors ligne
#11 Le 28/06/2014, à 18:02
- Gaara
Re : Peut-on intégrer cron dans un script python?
Bon, j'arrive dans le vif du sujet. J'utilise crontab.py, pas de soucis, ça fonctionne bien ! (solution 1 finalement).
Je ne sais pas si quelqu'un a une réponse, mais j'hésite:
La fonction
cron.remove_all()
enlève-t-elle toutes les tâches de cron, ou juste celles que l'on programme avec crontab.py ?
Car avec mes essais j'ai pleins de tâches, mais j'aimerais savoir si je peux utiliser cette fonction sans risque.
Je ne voudrais pas modifier la configuration des pcs avec mon logiciel !
Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid
<code>zenity --question --title "Alert" --text "Microsoft Windows has been found! Would you like to remove it?"</code>
Hors ligne
#12 Le 28/06/2014, à 21:03
- tiramiseb
Re : Peut-on intégrer cron dans un script python?
À mon avis ça enlève toutes les tâches présente dans la crontab de l'utilisateur concerné.
Tu peux éventuellement mettre un commentaire particulier sur celles que tu crées, puis utiliser "cron.remove_all(comment='machin-truc')"...
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#13 Le 28/06/2014, à 21:33
- Gaara
Re : Peut-on intégrer cron dans un script python?
Ah oui... J'avais pas pensé à ça.
Merci bien
Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid
<code>zenity --question --title "Alert" --text "Microsoft Windows has been found! Would you like to remove it?"</code>
Hors ligne
#14 Le 29/06/2014, à 17:20
- Gaara
Re : Peut-on intégrer cron dans un script python?
Je ne sais pas si tu as déjà utilisé ce module, mais je galère un peu pour réinitialiser cron.
Suivant ton conseil, j'ai commenté les tâches, pour ça pas de problèmes, ça se lance toujours.
Mais c'est pour enlever les anciennes tâches que j'ai un soucis:
>>> from crontab import CronTab
>>> cron = CronTab()
>>> cron.remove_all('recTV_start')
0
>>> cron.remove_all()
29
>>> cron.write() # pour valider et ecrire le fichier
Il y a bien 29 tâches (dont une que j'aimerais garder, factice) quand je regarde crontab -e.
Mais dès que je met le commentaire, il trouve rien...
Exemple des lignes qu'il y a dans le cron:
15 15 29 6 * python /home/guillaume/FACTICE # bien sur, ne pas l'effacer
0 16 29 6 * python /home/guillaume/.cache/recTV/start_command.py > /home/guillaume/.cache/recTV/debug_cron_on.log 2>&1 # recTV_start
Est-ce que je loupe quelque chose, ou est-ce un bug du module ?
Edit: lorsque je fais:
>>> cron.remove_all('FACTICE')
1
donc il trouve bien le factice (meme avec le commentaire # bien sur, ne pas l'effacer)
Mais il trouve pas pas ceux que je veux!!
Edit2: Bon ben j'ai trouvé...
>>> cron.remove_all('start_command.py')
28
Dernière modification par Gaara (Le 29/06/2014, à 17:53)
Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid
<code>zenity --question --title "Alert" --text "Microsoft Windows has been found! Would you like to remove it?"</code>
Hors ligne
#15 Le 30/06/2014, à 09:23
- tiramiseb
Re : Peut-on intégrer cron dans un script python?
Je ne sais pas si tu as déjà utilisé ce module
Je ne l'ai jamais utilisé.
>>> cron.remove_all('recTV_start') 0
Tu as oublié de lui dire de faire la recherche sur les commentaires...
=>
cron.remove_all(comment='recTV_start')
donc il trouve bien le factice (meme avec le commentaire # bien sur, ne pas l'effacer)
Bah oui, ça c'est normal, il ne va pas être intelligent, comprendre le français et voir qu'il y a un commentaire « bien sur, ne pas l'effacer »...
>>> cron.remove_all('start_command.py') 28
Mauvaise idée : si jamais il y a un autre job qui appelle un exécutable ailleurs qui porte le même nom, ça va l'effacer aussi.
Oui, c'est peu probable. Mais "peu probable" ne veut pas dire "impossible".
Reste sur l'idée des commentaires, en utilisant la bonne syntaxe !
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#16 Le 30/06/2014, à 10:44
- Gaara
Re : Peut-on intégrer cron dans un script python?
Bonjour,
Tu as oublié de lui dire de faire la recherche sur les commentaires
cron.remove_all(comment='recTV_start')
J'ai essayé, ça ne fonctionne pas non plus
si jamais il y a un autre job qui appelle un exécutable ailleurs qui porte le même nom
J'ai renommé mon executable de façon à ce que ce soit impossible (très très peu probable) de retrouver le même:
cron.remove_all('start_recTV_command.py')
cron.remove_all('stop_recTV_command.py')
Avec des noms pareils, ce serait vraiment pas de chance!
Et:
Bah oui, ça c'est normal, il ne va pas être intelligent, comprendre le français et voir qu'il y a un commentaire « bien sur, ne pas l'effacer ».
Nan mais je voulais dire qu'il ne regarde pas le commentaire, il cherche dans les noms des executables. (d'ailleurs ça écrit un log et il ne cherche pas non plus ici)
Dernière modification par Gaara (Le 30/06/2014, à 10:51)
Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid
<code>zenity --question --title "Alert" --text "Microsoft Windows has been found! Would you like to remove it?"</code>
Hors ligne
#17 Le 30/06/2014, à 10:45
- tiramiseb
Re : Peut-on intégrer cron dans un script python?
ce serait vraiment pas de chance!
C'est vrai, ce serait pas de chance
J'ai essayé, ça ne fonctionne pas non plus
Et donc plutôt de continuer et de trouver comment faire fonctionner cette voie plus propre, tu changes le nom de ton exécutable ?
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#18 Le 30/06/2014, à 10:50
- Gaara
Re : Peut-on intégrer cron dans un script python?
Et donc plutôt de continuer et de trouver comment faire fonctionner cette voie plus propre, tu changes le nom de ton exécutable ?
Bah... oui, c'est plus simple
Ceci dit, je laisse les commentaires !!
Kubuntu 18.04 x64
Un terminal tactile Raspberry Pi et Odroid
<code>zenity --question --title "Alert" --text "Microsoft Windows has been found! Would you like to remove it?"</code>
Hors ligne