Exécuter un script sous Linux pendant un laps de temps spécifié avant d’arrêter et de redémarrer

2

Peut-être lié à cela question précédente , J'aimerais pouvoir exécuter une tâche pendant un laps de temps déterminé, puis l’arrêter / la tuer, puis la redémarrer.

Plus précisément, j'exécute l'application Folding @ Home sur mon poste de travail Linux. Périodiquement, il aura des difficultés à se connecter au serveur domestique et restera inactif pendant longtemps, mais ne libèrera pas la mémoire / les ressources revendiquées (oui, je réalise que c'est probablement un bogue de l'outil, mais je peux t résoudre ce problème actuellement). En règle générale, le simple fait de tuer et de démarrer l'outil permet à celui-ci de se réenregistrer.

Donc, j'aimerais pouvoir exécuter quelque chose comme:

run_for <time> ./fah6

Est-ce qu'un tel outil existe, ou devrais-je écrire un wrapper que nukes le fah6 client après, disons, une semaine et le redémarrer?

warren
la source

Réponses:

5

Je suis peut-être de la vieille école, mais cela ressemble à un travail pour Cron. Il suffit de tuer / redémarrer avec cron selon un planning approprié. Vous devrez tenir compte si fah6 peut "reprendre là où il s'est arrêté" facilement, mais je ne vois aucun problème avec un redémarrage quotidien.

Hotei

hotei
la source
il reprend là où il s'était arrêté .. et je n'avais pas envisagé d'utiliser cron pour celui-ci :) .. Je vais voir à quel point cela peut être difficile à faire
warren
1
J'aime cette idée. Vous pouvez utiliser deux tâches cron pour vous assurer qu’elle s’exécute uniquement en dehors des heures de travail. killall fah6 à 9h00 et un autre qui le redémarre à 18h00.
Doug Harris
cette suggestion s’est avérée être une suggestion très utile. Merci!
warren
9

outil de délai d'attente.

timeout - lance une commande avec une limite de temps

délai d'attente [OPTION] DURATION COMMAND [ARG] ...
délai d'attente [OPTION]

Lancez COMMAND et éliminez-le s'il est toujours en cours d'exécution après DURATION.

par exemple:

    timeout 15s ./fah6 
Salami
la source
3
sleep 60 & VAR=$! ; sleep 10 ; kill $VAR

Dans cet exemple, ' dormir 60 'est un espace réservé pour la commande que vous souhaitez terminer plus tôt. Remplacer ' dix 'avec combien de temps vous voulez exécuter votre commande timed (au plus) en secondes. Ce qui précède devrait sortir après 10 secondes, tuant le ' dormir 60 'processus.

Notez que ceci est pour bash.

Slartibartfast
la source
Merci! Cette solution simple fait finalement le travail!
nightcoder
1

cron fonctionnera, mais si vous vouliez qu’elle ne soit exécutée qu’une seule fois, ou si l’heure change de jour en jour, son utilisation sera plus simple. at ( à la page de manuel ):

$ ./fah6 &
[1] 12345
$ at 1800
at> kill 12345
at> <EOT>

Les étapes sont les suivantes:

  • commencez fah6 comme tâche d’arrière-plan (la & à la fin de la ligne le démarre en tâche de fond). La ligne suivante indique le numéro de processus
  • at est suivi du temps nécessaire pour terminer le travail
  • la at> l'invite apparaît, tapez kill et le numéro de travail indiqué ci-dessus
  • pour arrêter d'entrer des commandes, quittez en appuyant sur Ctrl-D
Hamish Downer
la source
Comment pourrais-je connaître le numéro de processus si je veux le faire sans surveillance?
warren
1
@ Warren, vous pouvez utiliser $!, comme dans la réponse de slartibartfast
Hamish Downer
1

Personnellement, je mettrais en œuvre dans le script la capacité d’exécuter, d’attendre et de supprimer le sous-processus.

En python avec quelque chose comme:

http://docs.python.org/dev/library/multiprocessing.html

Si ce n'est pas en Python, utilisez os.system ('./ fah6') dans le code du script qui gère wait / stop / restart

bclermont
la source