nohup многократные последовательные команды не регистрируют вывод - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть скрипт Python (который занимает много времени, чтобы завершить выполнение), который мне нужно запустить несколько раз, меняя параметры. И это выполняется на удаленной машине. Для примера и в целях тестирования возьмите следующий скрипт test.py:

import time

print("\nStart time: {}".format(time.ctime()))
time.sleep(10)
print("End time: {}".format(time.ctime()))

Для этого я обычно использую nohup. Это прекрасно работает при одном выполнении с помощью следующей команды:

nohup test.py &

Выходы правильно сохранены в файле nohup.out. Чтобы выполнить последовательность, я провел некоторое исследование и нашел [этот вопрос] [1], и я придумал следующую команду:

nohup $(python test.py; python test.py) &

Который работает нормально. Я запустил команду, быстро вышел из системы и снова вошел и увидел htop первый запуск выполнения, затем завершение и затем запуск второго. Но проблема в том, что вывод не был сохранен в файл nohup.out. Если я жду в терминале, чтобы оба выполнения завершились, появляется следующая ошибка:

nohup: не удалось запустить команду «Пуск»: такого файла или каталога нет

Что я здесь не так делаю?

PS:. Мне нужно регистрировать выходные данные, потому что мне нужно видеть текущий ход выполнения скрипта и знать, какая ошибка произошла, если она не завершится должным образом. Так что если вместо nohup будет использоваться какая-то другая команда, которая может регистрировать python print, то это тоже приветствуется.

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Команде nohup передается утилита и аргументы для этой утилиты.

Если вы хотите запускать ваш сценарий последовательно через nohup, возможно, использование bash в качестве утилиты - неплохая идея

nohup bash -c "python ./test.py; python ./test.py"

Однако я рекомендую изучить использование пакета logging в python, поскольку я считаю nohup обходным решением ( nohup добавляется только к nohup.out, если стандартный вывод - это терминал .)

Кроме того, существует подход с использованием очереди для последовательного управления выполнением ваших задач.
Здесь вам не нужно быть многословным, чтобы запустить один и тот же скрипт дважды. Опять же, между тем, что у вас есть, и написанием рабочего для использования в очереди, я думаю, что вы проще: ¯ \ _ (ツ) _ / ¯

0 голосов
/ 02 ноября 2018

Ваша команда:

nohup $(python test.py; python test.py) &

Попытается выполнить вывод сценария. Это, вероятно, не то, что вы хотели.

Здесь вы хотели бы, чтобы nohup запустил команду, которая будет выполнять две команды последовательно. Самая простая программа, которая может это сделать, - запустить дочернюю оболочку:

nohup bash -c "python one.py; python two.py" &

Что касается лучшего способа сделать это, вы можете исследовать tmux или screen. Если вы запустите команду в tmux / screen, вы не только сможете отсоединить сеанс от запущенной в данный момент оболочки, но также сможете позже подключиться к сеансу, чтобы продолжить и взаимодействовать с программой.

...