Python как запустить программу в фоновом режиме

Я тут работаю над одним проектом(личный бот по факту) и возникла задача запустить его в фоне. То есть процесс будет висеть , но консоль(командная строка) будет закрыта(не свернута). Запуск скрипта с добавлением в конец https://qna.habr.com/q/559461″ target=»_blank»]qna.habr.com[/mask_link]

Фоновое выполнение команды с модулем sh в Python.

Асинхронное выполнение с помощью инкрементной итерации.

Можете создавать асинхронные команды, повторяя их с помощью специального ключевого аргумента _iter . Это создает итерацию (в частности, генератор), которую можно циклически перебирать:

from sh import tail # цикл будет работать вечно (если не поставить # таймаут или убить процесс сигналом) for line in tail(«-f», «/var/log/some_log_file.log», _iter=True): print(line)

По умолчанию ключевой аргумент _iter повторяет STDOUT, но можно изменить этот параметр, передав либо ‘err’ , либо ‘out’ (вместо True ). Кроме того, по умолчанию, выходные данные буферизуются строками, поэтому тело цикла будет выполняться только тогда, когда процесс создает новую строку. Вы можете изменить это, изменив размер буфера вывода команды с помощью _out_bufsize .

Python Selenium #7 Headless mode | Работа браузера в фоновом режиме

Примечание. Если нужен полностью неблокирующий итератор, то используйте специальный ключевой аргумент _iter_noblock . Если текущая итерация будет заблокирована, то будет возвращен errno.EWOULDBLOCK , в противном случае получите кусок вывода.

Запуск команды в фоновом процессе.

По умолчанию каждая запущенная команда терминала через модуль sh блокируется до завершения. Если какая-то команда выполняется длительное время, то можно запустить ее в фоновом режиме с помощью специального ключевого аргумента _bg=True :

import sh # блокирующий вызов sh.sleep(3) print(«. 3 секунды спустя») # НЕ блокирующий вызов p = sh.sleep(3, _bg=True) print(«печать сразу после запуска!») # ждем завершения `sh.sleep` p.wait() print(«. и 3 секунды спустя»)

Наверное заметили, чтобы возвратить результат после выхода из команды нужно вызвать метод RunningCommand.wait() .

Команды, запущенные в фоновом режиме, игнорируют SIGHUP , это означает, что когда их контролирующий процесс (лидер сеанса, если есть управляющий терминал) завершается, то ядро ​​не сигнализирует о их завершении. Но поскольку команды модуля sh по умолчанию запускают свои процессы в своих собственных сеансах, то есть они сами являются лидерами сеансов, игнорирование SIGHUP обычно не оказывает никакого влияния. Таким образом, единственный случай, когда игнорирование SIGHUP будет делать что-либо, — это использование ключевого аргумента _new_session=False , и в этом случае контролирующим процессом, вероятно, будет оболочка, из которой запустили python, и выход из этой оболочки обычно отправляет SIGHUP всем дочерним процессам.

Читайте также:
Как красиво начать концертную программу

Использование обратных вызовов с фоновым процессом.

В сочетании с _bg=True , модуль sh может использовать обратные вызовы для постепенной обработки выходных данных, передавая вызываемую функцию в ключевые аргументы _out и/или _err . Этот вызываемый объект будет вызываться для каждой строки (или фрагмента) данных, которые выводит команда терминала:

Автозапуск программ на python


from sh import tail # обратный вызов def process_output(line): print(line) p = tail(«-f», «/var/log/some_log_file.log», _out=process_output, _bg=True) p.wait()

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

Примечание. Возврат True не убивает процесс, он только предотвращает повторный вызов обратного вызова. Смотрите «Интерактивные обратные вызовы», чтобы узнать, как убить процесс из обратного вызова.

Интерактивные обратные вызовы.

Команды, вызываемые при помощи модуля sh могут взаимодействовать с базовым процессом в интерактивном режиме через определенную сигнатуру обратного вызова. Каждая команда, запущенная через sh , имеет внутреннюю очередь STDIN , которую можно использовать из обратных вызовов:

import sh def interact(line, stdin): if line == «Какова. скорость ласточки?»: stdin.put(«Африканская или европейская ласточка?») elif line == «Хм? Я . этого не знаю»: cross_bridge() return True else: stdin.put(«Я не знаю. AAGGHHHHH») return True p = sh.bridgekeeper(_out=interact, _bg=True) p.wait()

Примечание. Если используете очередь, то можно сигнализировать об окончании ввода (EOF) с помощью значения очереди None .

Можно также убить или завершить процесс или отправить любой сигнал, из обратного вызова, добавив третий аргумент в callback функцию для получения объекта процесса:

import sh def process_output(line, stdin, process): print(line) if «ERROR» in line: process.kill() return True p = sh.tail(«-f», «/var/log/some_log_file.log», _out=process_output, _bg=True)

Читайте также:
Лучшая программа для улучшения звука на ПК

Приведенный выше код будет выполняться, печатая строки из some_log_file.log до тех пор, пока в строке не появится слово ‘ERROR’ , после чего процесс команды tail будет убит и сценарий завершится.

Примечание. Можно также использовать RunningCommand.terminate() для отправки SIGTERM или RunningCommand.signal() для отправки другого сигнала.

Обратный вызов при завершении команды.

Функция обратного вызова, переданная ключевому аргументу с именем _done вызывается, когда процесс завершается, либо обычно (через успешный или ошибочный код выхода), либо через сигнал.

Вот пример использования ключевого аргумента _done для создания многопроцессорного пула, где sh.your_parallel_command выполняется одновременно не более 10 раз:

import sh from threading import Semaphore pool = Semaphore(10) def done(cmd, success, exit_code): pool.release() def do_thing(arg): pool.acquire() return sh.your_parallel_command(arg, _bg=True, _done=done) procs = [] for arg in range(100): procs.append(do_thing(arg)) [p.wait() for p in procs]

  • ОБЗОРНАЯ СТРАНИЦА РАЗДЕЛА
  • Передача параметров в команды модуля sh.
  • Коды завершения и исключения модуля sh.
  • Перенаправление вывода команды модуля sh.
  • Фоновое выполнение команды с модулем sh.
  • Конвейер в стиле Bash и модуль sh.
  • Использование sudo c модулем sh.
  • Использование ssh с модулем sh.
  • Специальные ключевые аргументы модуля sh.
  • Объект запущенной команды модуля sh.
  • Класс Command() модуля sh.
  • Частые вопросы по модулю sh.

Источник: docs-python.ru

Русские Блоги

Несколько способов запуска скриптов Python в фоновом режиме

Сценарий мониторинга test1.py, написанный на python, работает в режиме True. Когда ssh удален (с помощью терминала замазки), запустите сценарий с помощью следующей команды:

python test1.py .pyw». Двойной щелчок запускается в фоновом режиме без изменения кода.

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

Через вилку
В среде Linux процесс демона в c реализован с помощью fork, и python также может быть реализован таким образом. Пример кода следующий:

#!/usr/bin/env python import time,platform import os def funzioneDemo(): # Это пример конкретной бизнес-функции fout = open(‘/tmp/demone.log’, ‘w’) while True: fout.write(time.ctime()+’n’) fout.flush() time.sleep(2) fout.close() def createDaemon(): # форк процесс try: if os.fork() > 0: os._exit(0) except OSError, error: print ‘fork #1 failed: %d (%s)’ % (error.errno, error.strerror) os._exit(1) os.chdir(‘/’) os.setsid() os.umask(0) try: pid = os.fork() if pid > 0: print ‘Daemon PID %d’ % pid os._exit(0) except OSError, error: print ‘fork #2 failed: %d (%s)’ % (error.errno, error.strerror) os._exit(1) # Перенаправить стандартный IO sys.stdout.flush() sys.stderr.flush() si = file(«/dev/null», ‘r’) so = file(«/dev/null», ‘a+’) se = file(«/dev/null», ‘a+’, 0) os.dup2(si.fileno(), sys.stdin.fileno()) os.dup2(so.fileno(), sys.stdout.fileno()) os.dup2(se.fileno(), sys.stderr.fileno()) # Выполнить код в дочернем процессе funzioneDemo() # function demo if __name__ == ‘__main__’: if platform.system() == «Linux»: createDaemon() else: os._exit(0)

Читайте также:
Как восстановить программы на Айфоне через icloud

Через выскочку

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

1. Напишите скрипт на Python

[[email protected] t27]# cat test123.py #!/usr/bin/env python import os,time while True : print time.time() time.sleep(1)

2. Напишите файл конфигурации upstat

[[email protected] t27]# cat /etc/init/mikeTest.conf description «My test» author «[email protected]» start on runlevel [234] stop on runlevel [0156] chdir /test/t27 exec /test/t27/test123.py respawn

  • 3. Перезагрузить северную часть штата

initctl reload-configuration
[[email protected] t27]# start mikeTest mikeTest start/running, process 6635 [[email protected] t27]# ps aux | grep test123.py root 6635 0.0 0.0 22448 3716 ? Ss 09:55 0:00 python /test/t27/test123.py root 6677 0.0 0.0 103212 752 pts/1 S+ 09:56 0:00 grep test123.py
[[email protected] t27]# stop mikeTest mikeTest stop/waiting [[email protected] t27]# ps aux | grep test123.py root 6696 0.0 0.0 103212 752 pts/1 S+ 09:56 0:00 grep test123.py [[email protected] t27]#

Скрипт bash

1. код Python

[[email protected] test]# cat test123.py #!/usr/bin/env python import os,time while True : print time.time() time.sleep(1)

  • 2. Написать скрипт запуска

[r[email protected] test]# cat start.sh #! /bin/sh python test123.py для запуска процесса напрямую:

python test123.py

4. После перезапуска ssh выполните следующую команду:

tmux attach

  • Теперь вы можете видеть, что программа на python все еще работает нормально.

Источник: russianblogs.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru