Как перезагрузить linux python
Как сделать так, чтобы программа на 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 .34m,36m> Это дает мне ошибку: $ sudo update-alternatives --set python /usr/bin/python3.6 update-alternatives: error: no alternatives for python какие-либо предложения? @ GAD3R Спасибо. Мне удалось создать символическую ссылку вручную, чтобы указать на Python 3.6. Кроме того, у меня не установлен 3.7.Вы можете добиться этого, применяя следующие простые шаги -
- Проверьте версию Python на терминале - python --version
- Получите права пользователя root. По типу терминала - sudo su
- Запишите пароль пользователя root
- Выполните эту команду, чтобы перейти на Python 3.6 -
update-alternatives --install /usr/bin/python python /usr/bin/python3 1 - Проверьте версию Python - python --version
- Готово.
Создайте символическую ссылку для / usr / bin / python3. В моем LinuxMint:
Использование этих команд может помочь вам:
- проверьте версию python: ls /usr/bin/python*
- псевдоним: alias python='/usr/bin/pythonxx'
- повторного входа в систему: .
Простой ответ - добавить псевдоним для python3.6.
Просто добавьте эту строку в файл
/ .bashrc:, alias python3="python3.6" затем закройте свой терминал и откройте новый. Теперь, когда вы печатаете, python3 xxx он переводится в python3.6 xxx .
Это решение решает вашу проблему без необходимости слишком сильно настраивать вашу систему.
РЕДАКТИРОВАТЬ :
Как отметил Микаэль Кьер , это неверная конфигурация ANSIBLE в вашей системе.
Установите параметр ansible_python_interpreter конфигурации в / usr / bin / python3. Параметр конфигурации ansible_python_interpreter обычно устанавливается для каждого хоста в качестве переменной инвентаризации, связанной с хостом или группой хостов:
Как видно здесь о файле конфигурации:
Изменения могут быть внесены и использованы в файле конфигурации, который будет обрабатываться в следующем порядке:
Читайте также: