J'ai un programme qui effectue une grande quantité de travail (prend environ 4 à 5 heures) qui est démarré par cron lorsque toutes les données avec lesquelles il fonctionne deviennent disponibles. Parfois, lorsque j'attends sa fin, j'aimerais pouvoir démarrer un autre programme (interactif) à la fin. l'appel d'attente semble prometteur mais n'attendra que les enfants.
shell-script
process
hildred
la source
la source
ipc
également la communication interprocessus.man ipc
.Réponses:
Je préfère définitivement la solution EDIT # 3 (voir ci-dessous).
si son pas dans la même coquille utiliser un en boucle avec condition sur ps -p retour vrai. Mettez un sommeil dans la boucle pour réduire l'utilisation du processeur.
ou si votre UNIX prend en charge / proc (par exemple, HP-UX ne le fait toujours pas).
Si vous voulez un timeout
EDIT # 1
Il y a une autre manière: n'utilisez pas cron . Utilisez la commande batch pour empiler vos travaux.
Par exemple, vous pouvez empiler quotidiennement tous vos travaux. Le lot peut être réglé pour permettre un certain parallélisme afin qu'un travail bloqué n'arrête pas la totalité de la pile (cela dépend du système d'exploitation).
EDIT # 2
Créez un fifo dans votre répertoire personnel:
à la fin de votre travail:
au début de l'autre travail (celui qui attend):
Ce n'est pas du polling, c'est du bon vieux IO de blocage.
EDIT # 3
Utilisation de signaux:
Au début du ou des scripts qui attendent:
à la fin de votre long travail:
la source
Vous pouvez modifier votre tâche cron pour utiliser un indicateur.
Au lieu de
Vous pouvez utiliser
Et surveillez simplement ce fichier en script ou même manuellement. S'il existe, votre programme est en cours d'exécution; sinon, n'hésitez pas à faire ce que vous voulez.
L'exemple de script:
Si vous n'aimez pas utiliser
sleep
, vous pouvez modifier le script et l'exécuter via cron une fois par X minutes.Dans ce cas, l'exemple de script sera:
Cette façon est un peu plus facile, car vous n'avez pas besoin de trouver le PID de votre processus cron.
la source
Il n'y a aucune possibilité pour un processus d'attendre la fin d'un autre processus, sauf pour un parent d'attendre la fin de l'un de ses processus enfants. Si vous le pouvez, lancez le programme via un script:
Si vous ne pouvez pas le faire, par exemple avant de commencer la grande quantité de travail à partir d'un travail cron mais le programme interactif à partir du contexte de votre session, alors faites ceci
Il existe plusieurs façons de mettre en œuvre
notify_completion
. Certains environnements de bureau fournissent un mécanisme de notification ( Ouvrir une fenêtre sur un écran X distant (pourquoi "Impossible d'ouvrir l'affichage")? Peut être utile). Vous pouvez également en créer un à l'aide des notifications de modification de fichier. Sous Linux, la fonction de notification de changement de fichier est inotify .Réagir à la création de
/path/to/finished.stamp
:Si vous ne pouvez pas changer la façon dont
do_large_amount_of_work
est invoqué, mais que vous savez quel fichier il modifie en dernier, vous pouvez utiliser le même mécanisme pour réagir lorsque ce fichier est fermé. Vous pouvez également réagir à d'autres événements tels que le changement de nom d'un fichier (voir leinotifywait
manuel pour une liste de possibilités).la source
Demandez au script déclenché par le cronjob d'invoquer un script shell vide dans lequel vous pouvez insérer des tâches de suivi si vous en avez besoin.
C'est très similaire à l'approche de Gilles.
cronjob-task.sh
contient:où
post-execute.sh
est généralement vide, sauf si vous voyez que vous devez déclencher une tâche de suivi.la source