Как перезагрузить linux python

Обновлено: 03.07.2024

Как сделать так, чтобы программа на python автоматически перезапускала себя? Итак, скажем, есть действительно простая программа, такая как:

Теперь в оболочке Python вам нужно будет нажать либо кнопку «Выполнить», а затем «Запуск модуля (F5)», либо просто кнопку «f5» на клавиатуре. Это первый раз, когда вы запускаете его. Когда программа закончилась, вы вернетесь к своему файлу «Cheese.py» и затем нажмите «f5», чтобы снова запустить программу. Все со мной здесь? Итак, мой вопрос: как заставить программу автоматически перезагружаться без необходимости делать это вручную?

4 ответа

Это зависит от того, что вы подразумеваете под «перезагрузить себя». Если вы просто хотите непрерывно выполнять один и тот же код, вы можете заключить его в функцию, а затем вызвать его из цикла while True , например:

Если вы хотите фактически перезапустить сценарий, вы можете выполнить сценарий снова, заменив текущий процесс новым, выполнив следующие действия:

Это будет постоянно перезапускать скрипт, предоставляя аргументы командной строки от текущей версии к новой версии. Более подробное обсуждение этого метода можно найти в посте "Перезапуск скрипта Python внутри себя »от Петр Земек.

эта статья отмечает один элемент является:

Если вы используете вышеуказанное решение, имейте в виду, что exec*() функции вызывают немедленную замену текущего процесса, без очистки открытых файловых объектов. Поэтому, если у вас есть открытые файлы во время перезапуска скрипта, вы должны очистить они используют f.flush() или os.fsync(fd) перед вызовом exec*() функция .

Или вы можете попробовать

Затем вы можете запустить скрипт через

В такой ситуации, чтобы перезапустить скрипт, используйте следующий код:

В противном случае, когда вы запускаете скрипт через

Используйте этот код:

В любом случае, не забудьте импортировать sys module

Я использую терминал на своем Mac, чтобы перезапустить некоторые из моих скриптов на Python с помощью функции ниже.

Примечание: не забывайте пробел после «профиля»; или функция может молча сбоить!

Затем в нижней части моего сценария нужно перезапустить:

Исходный вопрос о сценарии с сыром:

Вы можете заключить что-то в while True: , чтобы оно выполнялось повторно, поскольку True всегда будет иметь значение True , например так:

Есть еще одна проблема с вашим кодом, хотя; Вы не вызвали lower , поставив после него круглые скобки.

Я запускаю свой сценарий 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 и я хотел бы иметь возможность обновить службу без перезагрузки сервера. Как лучше всего это сделать?

вы можете перезагрузить модуль, когда он уже был импортирован с помощью reload встроенная функция в Python 2:

В Python 3, reload был перенесен на imp модуль. В 3.4, imp был deprecated в пользу importlib и reload был добавлен последним. При таргетинге 3 или более поздней версии либо ссылаться на соответствующий модуль при вызове reload или импортировать его.

I думай, что это то, чего ты хочешь. Веб-серверы, такие как сервер разработки Django, используют это, чтобы вы могли видеть последствия изменений кода без перезапуска самого серверного процесса.

цитата из документов:

код модулей Python перекомпилируется и модуль уровня код перевыполняются, определение нового набора объектов, привязаны к именам в модуле словарь. Функция init модули расширения не называются второй раз. Как и все другие объекты в Python старые объекты только reclaimed after their reference counts падать до нуля. Имена в модуле пространство имен обновляются, чтобы указать на любой новые или измененные объекты. Другой ссылки на старые объекты (например, имена внешних модулю) не отскок для ссылки на новые объекты и должен обновляться в каждом пространстве имен где они происходят, если это необходимо.

как вы отметили в своем вопросе, вам придется восстановить Foo объекты, если Foo класс находится в foo модуль.

в Python 3.0–3.3 можно использовать: imp.reload(module)

на BDFL и ответил этот вопрос.

Я думаю, следовательно, теперь вы будете использовать importlib.reload(module) , хотя я не уверен.

особенно трудно удалить модуль, если он не является чистым Python.

Вы можете использовать sys.getrefcount (), чтобы узнать фактическое количество ссылки на литературу.

номера более 3 указывают на то, что будет трудно избавиться от модуль. Доморощенный " пустой" (не содержащий ничего) модуль должен быть мусор, собранный после

поскольку третья ссылка является артефактом функции getrefcount ().

reload(module) , но только если он полностью автономный. Если что-то еще имеет ссылку на модуль (или любой объект, принадлежащий модулю), то вы получите тонкие и любопытные ошибки, вызванные старым кодом, висящим дольше, чем вы ожидали, и такие вещи, как isinstance не работает в разных версиях одного и того же кода.

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

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

Я использую Ubuntu 16.04 LTS. Я python3 установил. Установлены две версии, python 3.4.3 и python 3.6 . Всякий раз, когда я использую python3 команду, она принимает python 3.4.3 по умолчанию. Я хочу использовать python 3.6 с python3 .

python3 --version шоу version 3.4.3

Я устанавливаю, ansible который поддерживает version > 3.5 . Поэтому, когда я набираю ansible в терминале, он выдает ошибку из-за python 3.4

Что ты sudo update-alternatives --config python3 говоришь? update-альтернативы: ошибка: нет альтернативы для python3 Смотрите мой комментарий в ответе ниже о том, как использовать ansible с определенной версией python3. Вы также можете рассмотреть возможность удаления Python 3.4.

Покажет вам ошибку:

Вам нужно обновить свою версию update-alternatives , тогда вы сможете установить версию Python по умолчанию.

Установите python3.6 по умолчанию.

Или используйте следующую команду, чтобы установить python3.6 по умолчанию:

Этот ответ, вероятно, сломается apt . После выбора другой версии Python попробуйте запустить sudo apt update . Если он дает ошибку , как ModuleNotFoundError: No module named 'apt_pkg' вы хотите , чтобы пойти /usr/lib/python3/dist-packages и создать символическую ссылку: ln -s apt_pkg.cpython-<34m,36m>-x86_64-linux-gnu.so . Это дает мне ошибку: $ sudo update-alternatives --set python /usr/bin/python3.6 update-alternatives: error: no alternatives for python какие-либо предложения? @ GAD3R Спасибо. Мне удалось создать символическую ссылку вручную, чтобы указать на Python 3.6. Кроме того, у меня не установлен 3.7.

Вы можете добиться этого, применяя следующие простые шаги -

  1. Проверьте версию Python на терминале - python --version
  2. Получите права пользователя root. По типу терминала - sudo su
  3. Запишите пароль пользователя root
  4. Выполните эту команду, чтобы перейти на Python 3.6 -
    update-alternatives --install /usr/bin/python python /usr/bin/python3 1
  5. Проверьте версию Python - python --version
  6. Готово.
Работает, прост для чтения и не использует псевдоним. +1 Отлично работает на Ubuntu 18.04. так просто, чем другие решения. Большое спасибо

Создайте символическую ссылку для / usr / bin / python3. В моем LinuxMint:

Использование этих команд может помочь вам:

  1. проверьте версию python: ls /usr/bin/python*
  2. псевдоним: alias python='/usr/bin/pythonxx'
  3. повторного входа в систему: .

спасибо, но после перезагрузки компьютера основным питоном будет все еще ex python 2.7

Простой ответ - добавить псевдоним для python3.6.

Просто добавьте эту строку в файл

/ .bashrc:, alias python3="python3.6" затем закройте свой терминал и откройте новый. Теперь, когда вы печатаете, python3 xxx он переводится в python3.6 xxx .

Это решение решает вашу проблему без необходимости слишком сильно настраивать вашу систему.

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

Как отметил Микаэль Кьер , это неверная конфигурация ANSIBLE в вашей системе.

Установите параметр ansible_python_interpreter конфигурации в / usr / bin / python3. Параметр конфигурации ansible_python_interpreter обычно устанавливается для каждого хоста в качестве переменной инвентаризации, связанной с хостом или группой хостов:

Как видно здесь о файле конфигурации:

Изменения могут быть внесены и использованы в файле конфигурации, который будет обрабатываться в следующем порядке:

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