Python перезапуск службы linux

Обновлено: 08.07.2024

У меня есть небольшой код python, который перезапускает nginx на нем не существует. Когда я запускаю sudo python monitor_server.py , все в порядке. Когда я попытался cron это с корнем cron ( sudo crontab -e ) с линией:
* * * * * python /root/monitor_server.py > /var/log/my_monitor/cron_log.log 2>&1 я получаю:

1 ответ

Python скрипт crontab, похоже, не работает. Когда я запускаю его вручную, python /home/ec2-user/code1.py он работает нормально, но когда его помещают в файл cron.txt для crontab, это не так. Мой файл crontab: @hourly python /home/ec2-user/code1.py >/dev/null 2>&1 я тоже пытался 0 * * * *.

Попробуйте вызвать команду, используя абсолютный путь, как вы называете ее без shell и под другой учетной записью пользователя, некоторые команды недоступны без указания абсолютного пути.

Сначала найдите, где находится команда:

Затем измените свой код на:

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

Я перепробовал все, чтобы установить python-crontab через менеджер пакетов, включая, но не ограничиваясь ими, pip, pyp, apt-get install, easy_install, и они не возвращаются с какой-либо ошибкой.

Какова наилучшая практика перезапуска системной службы ubuntu из программы python? Служба отвечает за запуск той же программы, из которой будет вызван перезапуск. Скрипт сервиса остановка,запуск и.

если я запускаю приведенный ниже скрипт вручную из putty (как root) , то служба перезапускается без проблем ручное управление sh /home/auser/server/reService.sh >> /var/log/reService.log Но.

Python скрипт crontab, похоже, не работает. Когда я запускаю его вручную, python /home/ec2-user/code1.py он работает нормально, но когда его помещают в файл cron.txt для crontab, это не так. Мой.

Я пытаюсь запланировать запуск сценария python каждую минуту или каждый час. Что я сделал до сих пор : crontab -e В файле crontab я добавил * * * * * /usr/bin/python /path/to/script/script.py После.

Я пытаюсь добавить строку в crontab моего системного пользователя из скрипта Python, который использует пакет python-crontab. Мой файл crontab еще не существует, и когда я запускаю этот код, ничего.

У меня есть система gentoo Linux и странное поведение crontab. Как пользователь root , и как я понимаю из документации, команда crontab -l перечисляет все задания crontab, определенные для текущего.

Я хотел бы попросить помощи с модулем python-crontab. У меня есть простой скрипт shell для записи потока интернет-радио с помощью команды curl. Я хочу планировать записи заранее, планируя их в.

Я хочу отредактировать system cron tab (/etc/crontab). я читал, что crontab-e-это лучший способ редактирования crontab, и вам не нужно перезапускать службы cron, если вы редактируете таким образом.

Я использую VPN соединение с использованием SSL Network Extender (SNX) для подключения к удаленному серверу. Подключение с удаленного сервера ограничено всего 12 часами. После этого соединение.

Я запускаю свой сценарий Python в фоновом режиме на моем компьютере с Ubuntu (12.04) следующим образом:

Теперь может быть возможно, что на каком-то этапе мой выше Python script может умереть по любой причине.

Так что я думаю иметь какой-то cron agent скрипт в bash shell, который может автоматически перезапустить мой вышеописанный скрипт на Python, если он по какой-либо причине будет убит

Возможно ли это сделать? Если да, то как лучше всего решить эту проблему?

ОБНОВИТЬ:

После создания testing.conf файла, как это -

Я запустил команду sudo, чтобы запустить ее, но я не вижу, как этот процесс выполняется с использованием ps ax?

Есть идеи, почему px axe мне ничего не показывает? И как я могу проверить, работает ли моя программа или нет?

Это мой скрипт на Python -

В Ubuntu (до 14.04, 16.04 и позже используйте systemd) можно использовать upstart для этого лучше, чем задание cron. Вы вводите настройки конфигурации /etc/init и убедитесь, что вы задаете респаун

Это может быть минимальный файл /etc/init/testing.conf (отредактируйте как root ):

И вы можете проверить с /your/base/directory/testing.py :

и следите за тем, что происходит (в другом окне), с помощью:

и остановитесь на:

Вы также можете добавить [start on][2] команду запуска при загрузке системы.

@Zelda: Спасибо за предложение . Я новичок в мире Linux / Unix .. Какие изменения я должен внести в /etc/init файл? Если вы можете предоставить пошаговое руководство для меня, тогда я смогу чему-то научиться и делать правильные вещи .. @ Вебби Я сделал ответ более полным. Если вы не хотите открывать файл для вывода и переписывать свои операторы печати, вы можете сделать что-то вроде sys.stdout = open(file_name, 'w') в начале. Спасибо, Зельда. Благодарим Вас за помощь. Я обновил вопрос с некоторыми деталями. Я пытаюсь сделать так, чтобы увидеть, запущен ли мой testing.py или нет .. Он не показывает мне, работает он или нет .. px ax | grep testing.py .. Он мне ничего не возвращает? Есть идеи почему? Вы должны поместить все это в предложение try / исключением и записать в файл журнала, какое исключение было сгенерировано и что программа закрывается. Возможно, оператор print не работает, так как не может записать в stdout.

Вы также можете использовать более ориентированный на оболочку подход. Найдите свой cron сценарий и перезапустите его, если он умрет.

Создайте новый crontab, запустив crontab -e . Откроется окно вашего любимого текстового редактора.

Добавьте эту строку в файл, который только что открылся

Сохраните файл и выйдите из редактора.

Вы только что создали новый, crontab который будет запускаться каждые 5 минут и запускать ваш скрипт, если он еще не запущен. Смотрите здесь для милого небольшого урока cron . Официальные документы по Ubuntu cron находятся здесь .

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

В || означает символ «это сделать , если предыдущая команда не удалось». Итак, если ваш скрипт не запущен, pgrep произойдет сбой, поскольку он ничего не найдет и ваш скрипт будет запущен.

Спасибо .. Но я новичок в Linux и Unix, так что не знаете, где находится crontab? Это файл в моей машине с Ubuntu? Спасибо Terdon .. Я могу запустить эту команду crontab -e из каталога, где мой скрипт Python .. Правильно? @ Вебби, вы можете запустить его где угодно. cron это демон планирования, это служба, которая работает в фоновом режиме. Если ваш скрипт на python отсутствует $PATH (если вы не можете запустить его из любого места, но вам нужно находиться в его каталоге), используйте полный путь к скрипту, как в моем обновленном ответе. Спасибо. Теперь это имеет смысл . Я только что создал новый crontab и отредактировал файл, добавив одну и ту же строку, но в течение 1 минуты . Я уже создал скрипт Hello World Python, вращающийся вокруг, в то время как True назван test.py .. После сохранения файл crontab, он должен автоматически запускать testing.py через 1 минуту? И затем продолжайте проверять каждую минуту, работает ли скрипт Python или нет? Если да, после сохранения файла crontab -e я сделал ps ax | grep testing.py и я не могу увидеть какой-либо процесс для этого?

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

Вы не должны действительно использовать это для производства, но вы могли бы:

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

Существует несколько способов мониторинга и повторного запуска процессов в UNIX / Linux. Одна из самых старых - это запись "респавна" в / etc / inittab . если вы используете старую систему инициализации SysV. Другой метод - использовать демон supervisor из пакета daemontools DJ Bernstein . Другие варианты - использовать функции в Ubuntu Upstart . или Systemd или других.

Но вы можете посмотреть на альтернативы init и в коде Python для Pardus: в частности, mudur daemon.

Если вы решите пойти с заданием cron (и обработкой файла PID), подумайте о том, чтобы прочитать этот PEP 3143 и, возможно, использовать его эталонную реализацию.

Как я упоминал в других моих комментариях, надежная обработка PID-файлов является сложной задачей. Это склонно к гонкам и угловым случаям. Это становится сложнее, если есть какой-либо шанс, что ваш файл PID окажется в NFS или другой сетевой файловой системе (некоторая атомарность гарантирует, что вы получите с семантикой обработки файлов в надлежащих локальных файловых системах UNIX / Linux, которые исчезнут в некоторых версиях и реализациях NFS, например). Также семантика вокруг блокировки файлов в UNIX может быть сложной. (Быстро ли снимается блокировка flock или fcntl блокировка в вашей целевой ОС, например, когда процесс, удерживающий ее, уничтожается с помощью SIGKILL?).

Вы также можете использовать мониторинг Monit Or Process с помощью ps-watcher.

Monit - это утилита с открытым исходным кодом для управления и мониторинга процессов, программ, файлов, каталогов и файловых систем в системе UNIX. Монит проводит автоматическое обслуживание и ремонт и может выполнять значимые причинно-следственные действия в ситуациях ошибки.

Вот пример для вашего сценария:

Вам нужен руководитель, вы можете использовать руководителя . Это основанный на Python супервизор, поэтому его легко изменить, если вам нужно.

Управление осуществляется с помощью файлов с синтаксисом .ini.

Ответ Тердона не сработал для меня, потому что pgrep -f testing.py никогда не « терпел неудачу». Было бы получить pid для задания cron (из-за опции -f). Однако без опции -f pgrep не найдет test.py, потому что нет процесса с именем test.py.

Моим решением этого было изменить

это означает, что полная работа crontab будет такой:

В моем случае, как быстрое исправление, я хотел, чтобы моя программа работала, когда она выходила с ошибкой en или она была убита. С другой стороны, я хотел остановить выполнение, когда программа завершилась правильно (код возврата = 0)

Я проверил это на Bash. Он должен нормально работать в любой другой оболочке

Для ответа Тердона, pgrep -f testing.py никогда не вернется false в соответствии с комментариями здесь :

Я думаю, проблема в том, что cron порождает оболочку для запуска вашей команды, а аргументы этой оболочки совпадают с pgrep, так как вы используете -f

Теперь возможно, что на какой-то стадии мой выше Python script может умереть по любой причине.

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

Можно ли это сделать? Если да, то каков наилучший способ решить эту проблему?

UPDATE:

После создания файла testing.conf , как это -

Я побежал под командой sudo, чтобы запустить его, но я не вижу, что этот процесс работает с использованием ps ax?

Любая идея, почему px ax не показывает мне ничего? И как проверить, работает ли моя программа или нет?

Это мой скрипт python -

В Ubuntu (до 14.04, 16.04 и позже используйте systemd) можно использовать выскочку, чтобы сделать это лучше, чем задание cron. Вы устанавливаете конфигурацию в /etc/init и убедитесь, что вы указали respawn

Это может быть минимальный файл /etc/init/testing.conf (редактировать как root ):

И вы можете проверить с помощью /your/base/directory/testing.py :

и следуйте за тем, что происходит (в другом окне):

Вы также можете добавить [start on][2] , чтобы команда запускалась при загрузке системы.

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

Создайте новый crontab, запустив crontab -e . Это откроет окно вашего любимого текстового редактора.

Добавьте эту строку в только что открывшийся файл

Сохраните файл и выйдите из редактора.

Вы только что создали новый crontab , который будет запускаться каждые 5 минут и запускает ваш скрипт, если он уже не запущен. См. здесь для небольшого учебника по cron . Официальные документы Ubuntu на cron являются здесь .

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

Символ || означает «сделать это, если предыдущая команда не удалась». Итак, если ваш скрипт не запущен, код pgrep завершится с ошибкой, так как он ничего не найдет и ваш скрипт будет запущен.

Существует несколько способов мониторинга и респаун-процессов в UNIX /Linux. Одним из самых старых является запись «respawn» в /etc /inittab . если вы используете старую систему SysV. Другим методом является использование демона супервизора из пакета daemontools DJ Bernstein. Другие варианты - использовать функции в Ubuntu upstart . или systemd или другие.

Но вы можете посмотреть альтернативы init и в коде Python для в частности, pardus: mudur .

Если вы решите пойти с заданием cron (и обработкой файлов PID), подумайте о том, чтобы прочитать этот PEP 3143 и, возможно, используя его ссылочную реализацию.

Как я уже упоминал в своих других комментариях, надежная обработка файлов PID сложна. Он склонен к гонкам и угловым делам. Это становится сложнее, если есть вероятность, что ваш файл PID попадет в NFS или другую сетевую файловую систему (некоторые из свойств, которые вы получаете с семантикой обработки файлов на правильной локальной файловой системе UNIX /Linux, уходят некоторые версии и реализации NFS, например). Также семантика вокруг блокировки файлов в UNIX может быть сложной. (Делает ли код flock или fcntl быстро выпущенный в вашей целевой ОС, когда процесс, в котором он выполняется, убит с помощью SIGKILL, например?).

вы можете поместить эту программу в фоновом режиме, и как только вы захотите остановиться, просто потяните ее на передний план и убейте ее.

Вы не должны использовать это для производства, но можете:

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

Вы также можете использовать monit или Контроль процесса с помощью ps-watcher

Monit - это утилита с открытым исходным кодом для управления и мониторинга, процессы, программы, файлы, каталоги и файловые системы в UNIX система. Monit проводит автоматическое техническое обслуживание и ремонт и может выполнять значимые причинные действия в ситуациях с ошибками.

Вот пример для вашего сценария:

Вам нужен супервизор, вы можете использовать диспетчер . Это супервизор на основе python, поэтому его легко изменить, если вам нужно.

Как запускать, останавливать и перезапускать службы в Ubuntu и другие вопросы Linux | Linux Китай


Служба является необходимым фоновым процессом, который обычно начинается с системой и отключается при выключении.

Служба является необходимым фоновым процессом, который обычно начинается с системой и отключается при выключении. Если вы системный администратор, то вы будете обрабатывать услуги на регулярной основе. Если вы обычный пользователь рабочего стола, вы можете столкнуться с ситуацией, которую необходимо перезапустить, такие как установка барьера в уставные мыши и клавиатуры между вашим компьютером. Или, когда вы используете UFW установить брандмауэр.

Сегодня я покажу вам два способа управления услугами. Вы научитесь запускать, останавливать и перезапускать службы в Ubuntu или любой другой дистрибутив Linux.

Systemd и INIT

Сегодня, Ubuntu и многие другие дистрибутивы используют Systemd вместо старой инициализации.

В Systemd, вы можете использовать службу управления командой SystemCTL.

В INIT, вы можете использовать службу управления командной службы.

Вы заметите, что даже если ваша система Linux использует Systemd, он все еще может использовать команду службы (используется с системой инициализации). Это происходит потому, что команда обслуживания фактически перенаправлена ​​SystemctL. Systemd вводит обратную совместимость, так как системные администраторы привыкли использовать команду службы.

В этом уроке, я буду также отображать SystemCTL и служебные команды одновременно.

Я использую Ubuntu 18.04, но другие версии процесса одинаковы.

Метод 1: Управление служб в Linux с помощью Systemd

Я начал с Systemd, потому что он был широко принят.

1, перечислить все услуги

Для управления услугами, в первую очередь необходимо знать, какие услуги доступны в системе. Вы можете использовать Systemd команду, чтобы перечислить все услуги в системе Linux:


Эта команда будет выводить состояние всех служб. состояние службы Давать возможность enabled 、 Запрещать disabled 、 щит masked (Неактивный перед отменой щита), статический static с участием Сформирован generated 。

Совместимый с командой Grep, вы можете отобразить только запущенные сервисы:


Display running services systemctl

Теперь вы знаете, как ссылки на все другие услуги, вы можете приступить к управлению ими.

Уведомление: В следующей команде <service-name> Вы должны использовать имя службы, которым необходимо управлять. (Например, сетевые-Manager, UFW и т.д.)

2, запустите службу

Чтобы запустить службу в Linux, вам нужно всего лишь использовать его имя:

3, остановка службы

Чтобы остановить службу Systemd, вы можете использовать команду systemctl. stop Вариант:

4, перезапуск службы

Чтобы перезапустить службу Systemd, вы можете использовать:

5, проверьте состояние службы

Вы можете подтвердить, что вы успешно выполнили определенные операции по печати статуса службы:

Это будет выводиться следующим образом:


Это содержание Systemd. Переключитесь Инициализировать.

Метод 2: Управление служб в Linux с использованием инициализации в Linux

Команда так просто, как Systemd.

1, перечислить все услуги

Чтобы получить список всех служб Linux, используйте:


передний [ – ] представлять Запрещать , [ + ] представлять Давать возможность 。

2, запустите службу

Чтобы запустить службу в Ubuntu и других релизов, используйте команду:

3, остановка службы

Остановите службу столь же просто.

4, перезапуск службы

Если вы хотите, чтобы перезапустить службу, команда:

5, проверьте состояние службы

Кроме того, проверьте, будут ли достигнуты ожидаемые результаты, вы можете выводить статус:

Это будет выводиться следующим образом:


Самое главное, это скажет вам, является ли услуга активна (работает).

Сегодня я подробно два очень простых способов управления услугами на Ubuntu или любой другой системы Linux. Я надеюсь, что эта статья поможет вам.

Читайте также: