Journal Modifier la cron, randomiser, heure irrégulière...

Posté par  (site web personnel, Mastodon) .
Étiquettes : aucune
0
15
mai
2004
Bonjour,

Je souhaite écrire un script un peu particulier.

Celui devra contenir une liste de machine auxquelles il peut se connecter.

Le script devra se connecter à une machine au hasard parmi sa liste et, si celle-ci ne répond pas, en choisir une autre. aucune idée de comment faire ça d'ailleurs..

Une fois connecté à une machine, il devrait vérifier si une entrée est déjà dans la table cron et si non, l'y ajouter. comme crontab utilise vim, je ne sais pas comment faire ça dans un script.

Quelqu'un peut m'aider pour ce genre de choses ? Je dois avouer que ça dépasse mes compétences.

Tant qu'on y est, je cherche aussi deux choses avec cron :

- effectuer une action tous les jours entre midi et 13h mais pas toujours à la même minute (ouais, y'a des ptits trucs ou j'ai envie d'un minimum de surprise ;) )

- n'effectuer une action que si un user particulier est loggué. A priori je pense à un script qui vérifie le whois mais y'a ptêtre plus facile.

Merci à tous les avis et les aides :)
  • # Dodo ??

    Posté par  . Évalué à 7.

    Pour faire s'effectuer une action entre 12 et 13h le mieux serai de lancer un sleep aléatoire à douze juste au début du script :)

    Pour le whois je dit rien, j'aurai fait pareil ;)
    • [^] # Sleep aléatoire

      Posté par  . Évalué à 4.

      Par exemple dans ton script bash lancé à 12h00, tu ajoutes au début

      sleep $(($RANDOM % (60 * 60)))

      le script va dormir un nombre de seconde aléatoire entre 0 et 60 x 60 - 1, soit pratiquement une heure. La suite du script sera donc bien exécuté à un instant aléatoire entre 12h00 et 13h00.

      Si tu n'utilises pas bash pour écrire ton script, l'adaptation à tout autre shell ne doit pas être bien compliquée.
  • # cron n'utilise pas vim...

    Posté par  (site web personnel) . Évalué à 2.

    cron n'utilise pas vim mais la variable $EDITOR

    essaye ça :
    EDITOR=cat crontab -e

    ça va affichier la crontab.
    donc, il suffit de faire un oneliner perl, le mettre dans EDITOR, et de lancer crontab -e

    Pour les machines au hasard, il faut pareil, faire un script, sur la base d'une simple boucle tant que, je ne voit pas vraiment la difficulté.
    • [^] # Re: cron n'utilise pas vim...

      Posté par  (site web personnel, Mastodon) . Évalué à 2.

      la difficulté c'est que je ne connais pas le perl... Et que c'est donc pas évident pour moi de faire un one-line perl..

      Mais je vais essayer, merci pour l'info de la variable.

      PS : c'est pas EDITOR = cat que tu voulais dire ?

      Mes livres CC By-SA : https://ploum.net/livres.html

      • [^] # Re: cron n'utilise pas vim...

        Posté par  . Évalué à 3.

        La ligne
        VARIABLE=bidule commande
        modifie l'environnement de la commande, mais uniquement celui là.

        Donc tu modifies l'éditeur par défaut pour crontab en mettant :
        EDITOR=cat crontab -e
        Sans pour autant modifier la variable EDITOR pour le reste de tes applications.

        Dans le même ordre d'idée, un petit COLUMNS=200 dpkg -l pour avoir la liste de tous les packages sans les noms tronqués, ou bien LANG="en_US" programme pour ne pas subir le mode français d'un programme mal traduit, etc...
    • [^] # Re: cron n'utilise pas vim...

      Posté par  . Évalué à 1.

      si tu n'es pas allergique aux fichiers temporaires, tu peux aussi essayer :

      MONFICHIER=`tempfile`
      crontab -l > $MONFICHIER
      ## ici modifier le fichier $MONFICHIER avec la méthode de ton choix
      crontab $MONFICHIER
      rm $MONFICHIER
  • # w + crontab + Perl

    Posté par  (site web personnel) . Évalué à 1.

    Pour savoir qui est logué aprement ça se trouve dans /var/run/utmp (d'après w(1)) et d'après crontab(5), les fichiers définissant les actions à faire effectuer par cron se trouvent dans /var/spool/cron/crontabs mais "they are not intended to be edited directly". Enfin ya peut être moyen quand même... Sinon Except/Tk permet d'utiliser des programmes qui ne sont normalement pas "automatisables". J'ai utilisé ça une fois pour passwd, ya peut être qq chose pour vi.

    En admettant que la liste de machines contient une entrée par ligne, en Perl un truc pareil ça devrait marcher:

    open(FH, $list_file) or die('C'est malin.');
    do {
    rand($.) < 1 && ($machine = $_) while ;
    }
    until (connect_machine($machine));

    Pour la connection proprement dite, faut juste trouver le module qui va bien pour ce que tu veux faire (genre Net::SSH ou IO::Socket::INET::SSL).

    pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.