У меня есть программа, выполняющая большой объем работы (занимает около 4-5 часов), которая запускается cron, когда становятся доступными все данные, с которыми она работает. Иногда, когда я жду, пока он закончится, я хотел бы иметь возможность запустить другую (интерактивную) программу, когда она закончится. ожидание вызова выглядит многообещающим, но будет ждать только детей.
shell-script
process
hildred
источник
источник
ipc
также межпроцессное взаимодействие.man ipc
,Ответы:
Я определенно предпочитаю решение EDIT # 3 (см. Ниже).
если его не в той же оболочке использовать то время как цикл с условием на пс -p возвращает истину. Включите режим сна, чтобы уменьшить нагрузку на процессор.
или если ваш UNIX поддерживает / proc (например, HP-UX все еще не поддерживает).
Если вы хотите тайм-аут
РЕДАКТИРОВАТЬ # 1
Есть другой способ: не используйте cron . Используйте пакетную команду, чтобы сложить ваши задания.
Например, вы можете ежедневно складывать все свои работы. Пакет может быть настроен для обеспечения некоторого параллелизма, поэтому заблокированное задание не остановит весь стек (это зависит от операционной системы).
РЕДАКТИРОВАТЬ № 2
Создайте fifo в вашем домашнем каталоге:
в конце вашей работы:
в начале другой работы (тот, кто ждет):
Это не опрос, это старая хорошая блокировка ввода-вывода.
РЕДАКТИРОВАТЬ № 3
Используя сигналы:
В начале сценария (ов) кто (а) ждет:
в конце вашей долгой работы:
источник
Вы можете изменить свою работу cron, чтобы использовать какой-либо флаг.
Вместо того
Вы можете использовать
И просто контролировать этот файл в сценарии или даже вручную. Если он существует, значит, ваша программа работает; в противном случае не стесняйтесь делать все, что вы хотите.
Пример скрипта:
Если вам не нравится использовать
sleep
, вы можете изменить скрипт и запускать его через cron один раз в X минут.В этом случае пример скрипта будет:
Этот способ немного проще, так как вам не нужно находить PID вашего процесса cron.
источник
У процесса нет возможности ожидать завершения другого процесса, за исключением того, что родительский процесс ожидает завершения одного из своих дочерних процессов. Если вы можете, запустите программу через скрипт:
Если вы не можете сделать это, например, перед тем, как хотите начать большой объем работы с задания cron, но с интерактивной программой из контекста сеанса, сделайте это
Есть несколько способов реализации
notify_completion
. В некоторых средах рабочего стола предусмотрен механизм уведомлений ( может быть полезно открыть окно на удаленном дисплее X (почему «Не удается открыть дисплей»)? ). Вы также можете сделать один, используя уведомления об изменении файла. В Linux средство уведомления об изменении файла - inotify .Реагировать на создание
/path/to/finished.stamp
:Если вы не можете изменить способ
do_large_amount_of_work
вызова, но знаете, какой файл он изменяет последним, вы можете использовать тот же механизм, чтобы реагировать, когда этот файл закрыт. Вы также можете реагировать на другие события, такие как переименование файла (inotifywait
список возможностей см. В руководстве).источник
Пусть сценарий, запускаемый cronjob, вызывает пустой сценарий оболочки, в который вы можете вставить последующие задачи, если они вам нужны.
Это очень похоже на подход Жиля.
cronjob-task.sh
содержит:где
post-execute.sh
обычно пусто, если только вы не видите, что вам нужно запустить последующую задачу.источник