Запуск скрипта Python в фоновом режиме Linux

Обновлено: 21.11.2024

Когда я искал в Google способы запуска скрипта Python в фоновом режиме при загрузке, я видел несколько способов сделать это. Systemctl и rc.local. Мне не удалось заставить метод systemctl работать. Из ссылок на использование rc.local я не уверен, что это то, что мы «должны использовать» больше? Будут ли проблемы с использованием rc.local в будущем с Raspbian?

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

Если скрипт не имеет "визуального" компонента (пользовательского интерфейса любого типа), использование rc.local не является проблемой и по-прежнему поддерживается.

- используйте полные пути для правильной версии python и скрипта.
- используйте "su" для запуска от имени "pi", если сценарий предназначен именно для этого.
- не используйте "sudo", если скрипт должен запускаться от имени пользователя root, rc.local в любом случае запускается от имени пользователя root.
- направить вывод в лог-файл, чтобы убедиться, что он работает.
– добавьте "&" в конец командной строки, чтобы она работала в фоновом режиме.

Если скрипт не имеет "визуального" компонента (пользовательского интерфейса любого типа), использование rc.local не является проблемой и по-прежнему поддерживается.

Многие расскажут вам о файле автозапуска, но имейте в виду, что файл автозапуска странный — он работает не так, как вы ожидаете (примерно по полудюжине причин), а модель имени/местоположения/разрешений файла файл продолжает меняться. Поэтому я настоятельно не рекомендую пытаться использовать его.

Теперь вы *МОЖЕТЕ* запустить программу с графическим интерфейсом из rc.local — вам просто нужно сделать несколько вещей:

1) Установите для переменной DISPLAY что-то вроде :0.0
2) Как отмечалось в предыдущем постере, используйте «su» или «runuser», чтобы запустить его от имени пользователя «pi» (вместо «root» по умолчанию). ")
3) Подождите, пока рабочий стол не заработает. Один из способов сделать это (который я использую в своих сценариях оболочки):

Примечание. Вы можете сделать это более удобным, выполнив аналогичный вышеприведенный код в коде Python, а не в качестве оболочки оболочки. Но я не использую Python, так что решать вам.

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

Один из способов — использовать pythonw, pythonw — это конкатенация python+без окна терминала, т. е. запустить python без окна терминала. Вы можете использовать его, запустив в терминале следующую строку:

Вот файл background.py:

В Linux и Mac для запуска py-файлов в фоновом режиме вам просто нужно добавить и подписать после использования команды, это сообщит интерпретатору запустить программу в фоновом режиме

Программа будет работать в фоновом режиме, одновременно с этим вы сможете использовать терминал. Там будет идентификатор процесса для фонового процесса, если вы хотите, вы также можете убить процесс с помощью, так как вы не можете просто убить его с помощью CTRL+C. Чтобы убить его, откройте другой сеанс терминала и используйте команду

kill — сокращение от процесса уничтожения, тогда как -9 используется для немедленного завершения процесса, соответствующий статус будет обновлен. Чтобы получить результат, вы можете сбросить его в файл с помощью

python filename.py > filenameToFlush &

Он будет генерировать вывод, т. е. сбрасывать вывод в файл, но он обновляется в буферной памяти, вам нужно дождаться завершения работы программы, чтобы отразить вывод в файле на жестком диске. Чтобы решить эту проблему, вам просто нужно указать интерпретатору Python, что он не использует шаги буферизованной памяти:

Завершить/убить запущенный в данный момент файл

Теперь используйте утилиту

python -u имя_файла.py > FileToFlush &

Вывод будет напрямую помещен в выбранный вами файл.

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

Теперь вам не нужно сбрасывать вывод в какой-либо файл, поскольку утилита nohup во время выполнения создает файл с именем nohup.out. Это будет похоже на файл журнала. Имя выходной заливки, сгенерированной nohup, будет отражено. Чтобы завершить это выполнение, вам понадобится процесс идентификации. Нет проблем, если вы можете вспомнить или нет, вам нужно найти файл. Просто используйте следующую команду

grep предназначен для поиска по шаблону, он будет отражать идентификатор процесса на терминале, просто уничтожьте его, используя kill -9 ID. Теперь процесс завершен

У меня есть скрипт, который я запускаю с помощью pypy. Как мне запустить его как демон? Члбы я мог управлять им из консольных команд start stop и restart?

Поэтому программа работает "в фоновом режиме", она должна сама следить за тем, чтобы не заблокировать консоль и не умереть при закрытии bash или доверить это специальной программе.

Как перейти в фоновый режим самостоятельно:
Процессы (запущенные программы) имеют идентификаторы и я знаю кто запускал, сохраняя идентификатор родительского процесса. Таким образом, у нас есть дерево процессов. Родительский процесс может управлять дочерним, и он должен на своем конце завершать свои дочерние процессы. Если он этого не сделает, то дочерний процесс заменит родительский процесс, т.е. процесс инициализации. Поэтому, чтобы перейти в фоновый режим, ваша программа должна остановить только родительский процесс.
Проблема в том, что родительским процессом для программы, которую вы запускаете в консоли, является сама консоль, и нам не нужно ее закрывать.
Поэтому оставляя в фоне программы перед остановкой родителя повышать уровень вложенности - т.е. запускать его копию, и эта копия, будучи дочерним по отношению к первому процессу программы, убивает не баш, как вспомогательный родительский процесс.
Еще один момент — избавиться от консоли. Все просто — необходимо перенаправить stdin, stderr и stdout в файлы.
И, наконец, мы должны позаботиться о том, чтобы контролировать демона, пока у нас нет другого выбора, кроме как посылать ему сигналы с помощью команды убить. Для реализации более интуитивно понятной команды необходимо сделать две вещи:
1) оставив в фоновом режиме сохранить в файл pid получившегося процесса
2) написать немного кода в программе самостоятельно или в дополнительном скрипте, который при вызове в консоли будет считывать pid из файла и манипулировать процессом.

Данный функционал часто выделен в отдельную библиотеку, можно поискать в документации или на github.

Еще один вариант — использовать вспомогательную программу.
С одной стороны у нас есть возможности bash - джобы т.е. фоновые процессы, которые однако умирают при закрытии консоли. Чтобы обойти это, есть команда disown и программа nohup и setsid.
Они позволяют в любом случае избавиться от bash. Однако управлять процессом можно только сигналами.
С другой стороны есть менеджеры процессов. Например, supervisord или pm2. Это программы, которые умеют переходить в фоновый режим и могут, как демон, запускать другие программы и управлять ими.

И, наконец, всегда есть главный диспетчер процессов вашего компьютера/сервера — это система обеспечения, которая сейчас почти везде — systemd. Делает то же самое, что и обычный менеджер процессов, но также позволяет управлять последовательностью запуска процессов.

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

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

Invicti Web Application Security Scanner — единственное решение, обеспечивающее автоматическую проверку уязвимостей с помощью Proof-Based Scanning™.

Наша аудитория поддерживает Geekflare. Мы можем получать партнерские комиссионные за покупку ссылок на этом сайте.

Обеспечьте безопасность приложений правильно! Обнаружение, защита, мониторинг, ускорение и многое другое…

Возможно, вы знаете, как запускать скрипты Python, если вы знакомы с Python.

Почему вы должны прочитать эту статью? И еще один шанс, что вы не знаете, как запускать скрипты Python, поскольку не знакомы с ними. Это точно для вас. Это только для вас? Нет, и те, кто знаком с Python, и те, кто не знаком, могут почерпнуть что-то новое в этой статье. Без лишних слов давайте перейдем к статье.

Прежде чем переходить к выполнению части руководства, нам необходимо установить Python в наших системах.

Откройте текстовый редактор и создайте скрипт Python, который будет использоваться в этом руководстве. Вы можете использовать следующий скрипт добавления двух чисел.

Сценарии Python можно запускать в среде IDE одним щелчком мыши. Запуск скриптов Python в IDE — это простая вещь. Вы найдете кнопку для запуска скрипта Python с тем же именем. Щелкните ее, чтобы запустить скрипт Python.

Общий путь

Самый распространенный способ запуска сценариев Python – использование командной строки или терминала. Давайте посмотрим, как запустить сценарии Python с помощью командной строки или терминала.

  • Откройте командную строку или терминал.
  • Перейдите в каталог, где находится ваш скрипт Python.
  • Запустите скрипт с помощью команды python3 script_name.py (ключевое слово может измениться на python в соответствии с вашей конфигурацией).
  • Готово. Вы можете увидеть результат в следующей строке.

Вы можете запускать сценарии Python с помощью описанных выше шагов независимо от вашей операционной системы. Вышеуказанные шаги работают со всеми основными операционными системами.

Существуют и другие способы запуска сценариев Python в разных операционных системах. Давайте рассмотрим их один за другим.

macOS/Ubuntu

Мы можем использовать скрипт bash для запуска скрипта Python в macOS/Ubuntu. Обе эти операционные системы поддерживают сценарии bash. Давайте посмотрим, как запустить сценарии Python с помощью сценария bash.

  • Откройте любой текстовый редактор.
  • Создайте файл для написания скрипта bash с расширением sh и вставьте следующий код.
  • Обновите путь в сценарии bash.
  • Запустите сценарий bash с помощью команды ./bash_script_name.sh

Вы также можете узнать, как запускать сценарии bash в Python.

Убунту

Есть еще один классный способ запуска скриптов Python в Ubuntu.

Допустим, у вас есть приложение с графическим интерфейсом, написанное на Python. Его сложно запустить, каждый раз следуя вышеуказанным методам. Как мы можем запустить его в один клик? Как насчет того, чтобы запустить его из панели управления? Разве это не круто?

Да, мы можем создать запись на рабочем столе для скрипта Python.

Давайте рассмотрим шаги по запуску скрипта Python с панели управления.

  • Откройте любой текстовый редактор и создайте новый файл.
  • Вставьте следующий код в файл и сохраните его с расширением рабочего стола в папке /home/your_username/.local/share/application/.

Вы можете изменить название с "добавить" на любое другое.

  • Создайте сценарий bash для запуска сценария Python. Это точка входа для приложения. Вставьте в него следующий код.

Укажите путь к вашему скрипту относительно домашнего каталога в скрипте bash. И обновите путь к сценарию bash в приведенной выше записи на рабочем столе.

  • Теперь нажмите клавишу Windows и найдите запись на рабочем столе с именем, которое вы дали. И запустите его.

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

Мы видим, что терминал закрывается после запуска скрипта Python. Мы не можем видеть результат даже секунду. Чтобы избежать этой проблемы, нам нужно держать терминал открытым даже после выполнения скрипта. Добавьте новую строку в скрипт bash следующим образом.

Теперь запустите его снова. И перед вами результат.

Окна

Есть еще один способ запуска скриптов Python в Windows. Мы можем использовать Run для выполнения скриптов Python. Давайте посмотрим, как запустить скрипты Python с помощью команды «Выполнить».

  • Откройте Run, нажав клавишу Windows + R .
  • Введите py C:\path\to\script.py в диалоговом окне "Выполнить" и нажмите клавишу ввода.
  • Командная строка закрывается после завершения выполнения. Мы даже можем увидеть результат. Как решить эту проблему?

Мы можем использовать пакетный скрипт, чтобы командная строка оставалась открытой даже после выполнения скрипта Python. Для этого создайте файл с расширением bat и вставьте в него следующий код.

Теперь еще раз откройте диалоговое окно «Выполнить» с помощью сочетания клавиш Windows + R и введите путь к пакетному скрипту. Он запустит скрипт Python, указанный в пакетном скрипте. Теперь вы можете увидеть результат.

Заключение

Выберите наиболее подходящий способ запуска сценариев Python. И наслаждайтесь написанием кода на Python.

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