Как связать выполнение скриптов? [дубликат]

Я хочу автоматизировать выполнение скрипта Python. И я думаю, что уже знаю, как это сделать с помощью записи в cron.

Проблема в том, что мне нужно, чтобы этот сценарий запускался снова, только если предыдущий завершился.

Сценарий Python читает из файла .csv (только первую запись) и передает его в качестве параметров для сценария в дальнейшем. Затем эта запись удаляется из этой таблицы (которая по сути похожа на список запусков, которые необходимо выполнить) и перемещается в другую таблицу для завершенных задач вместе с результатом сценария.

Итак, поскольку записи удаляются при каждом запуске, мне нужно, чтобы следующая итерация скрипта запускалась только после завершения предыдущей.

Как / Могу я сделать это в Ubuntu 16.04 LTS?

РЕДАКТИРОВАТЬ:

Я попытался составить расписание для скрипта python таким образом и установил run-one вот так:

sudo apt-get update
sudo apt-get install run-one

# The below code is in crontab
* * * * * run-one python '/home/phdmonster/Downloads/nn course/my_code.py'

И это не работает. Никакие задачи не запускаются.

Правка Сергея Колодяжного: Проблема решена в комментариях, также обсуждается в связанном чате; проблема была с дополнительными * , связанные дубликаты работают в соответствии с комментариями OP

0
задан 27 January 2018 в 10:56

2 ответа

Поскольку Вы используете крон, я предполагаю, что Вы запускаете свой сценарий равномерно. Каждое выполнение изменяет файл результата.

Таким образом, сценарий может сделать следующее в своем запуске:

  • проверьте, существует ли файл результата (т.е. это - первый показ),
  • если это не делает, то создайте его
  • вычислите время начала предыдущего выполнения
  • проверьте, является ли время изменения файла результата более новым, чем это время начала
  • если это не это, означает, что последнее выполнение еще не закончилось, поэтому выходы сценария, ничего не делая

Первые два объекта там для получения выполнения процесса. Если Вы не будете включать их, то первый показ ничего не сделает, поскольку он ожидает несуществующего предшественника для окончания.

0
ответ дан 31 October 2019 в 03:16

При запуске сценария с крона и want's, чтобы проверить, что предыдущий был завершен прежде, чем запустить следующий, Вы могли бы заставить свой сценарий создать в некотором предопределенном месте, символьной ссылке на ее представление в/proc (/proc / [PID]), и затем стереть его в конце.

Необходимо было бы затем проверить, разорвана ли связь прежде, чем выполнить его снова, или проверьте, что это - командная строка /proc/[PID]/cmdline если бы это не повреждается для случая, катастрофический отказ предотвратил бы ссылку, которая будет стерта, и другой процесс появится с тем же PID (Если процесс будет все еще работать, то командная строка будет иметь ожидаемое содержание. Если это - что-либо еще, то это означает, что это - просто другой процесс с тем же PID).

Если Вы просто хотите объединить список в цепочку сценариев, но только если предыдущий сценарий не дал ошибки, то, Вам, вероятно, не нужен крон.

Вы могли бы просто использовать && синтаксис для объединения в цепочку различных сценариев: оболочка протестирует код возврата одного сценария и запустит следующий, только если не было никакой ошибки:

script1 && script2

Если Вы хотите, чтобы один сценарий выполнялся неоднократно, в то время как нет никакой ошибки, можно использовать while синтаксис для выполнения его неоднократно, пока это не возвращает не нулевой код возврата.

while script; do true; done # here the true command, is just a "no operation"
0
ответ дан 31 October 2019 в 03:16

Другие вопросы по тегам:

Похожие вопросы: