На этот вопрос уже есть ответ здесь:
Я хочу автоматизировать выполнение скрипта 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
Поскольку Вы используете крон, я предполагаю, что Вы запускаете свой сценарий равномерно. Каждое выполнение изменяет файл результата.
Таким образом, сценарий может сделать следующее в своем запуске:
Первые два объекта там для получения выполнения процесса. Если Вы не будете включать их, то первый показ ничего не сделает, поскольку он ожидает несуществующего предшественника для окончания.
При запуске сценария с крона и 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"