Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 smile


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 !

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 !!!

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 wink

- 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...

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 smile

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... roll

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:
mini_648953recTV.jpg


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...

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')"...

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 smile


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!! sad

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 »... smile

>>> 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 !

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 smile

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 ? smile

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 smile
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