Запуск Python в фоновом режиме на OS X - PullRequest
12 голосов
/ 01 марта 2012

Есть ли способ сохранить мой скрипт Python (с бесконечным циклом while) в фоновом режиме на OS X?Кроме того, для той же цели, есть ли способ иметь "автозапуск" Python-скрипт на USB-накопителе?

Ответы [ 5 ]

34 голосов
/ 01 марта 2012

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

Например, у Боба есть простой скрипт на python, который каждую секунду записывает слово «foo» в файл в его домашнем каталоге:

#!/usr/bin/env python
import os
import time

while True:
  os.system('echo " foo" >> /Users/bob/foostore.txt')
  time.sleep(1)

Чтобы запустить его как процесс-демон, создайте файл plist, ~/Library/LaunchAgents/com.bobbob.osx.test.plist, с содержанием:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN http://www.apple.com/DTDs/PropertyList-1.0.dtd >
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>com.bobbob.osx.test</string>
    <key>Program</key>
    <string>/Users/bob/pyfoo.py</string>
    <key>KeepAlive</key>
    <true/>
  </dict>
</plist>

Затем используйте launchctl для загрузки списка с терминала:

launchctl load ~/Library/LaunchAgents/com.bobbob.osx.test.plist

Это загрузит этот скрипт и сразу запустит программу в элементе <string> под <key>Program</key>. Вы также можете указать аргументы для программы, используя узел <ProgramArguments> с массивом элементов <string>. Для получения дополнительной информации см. Справочную страницу launchd.plist

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

launchctl unload ~/Library/LaunchAgents/com.bobbob.osx.test.plist

Метка, используемая в сценарии, может быть любой, но она должна быть уникальной в вашей системе, поэтому Apple обычно использует обратное доменное имя.

Что касается автозапуска скрипта, я не думаю, что есть какой-либо способ сделать это.

2 голосов
/ 01 марта 2012

Смотрите этот вопрос, чтобы узнать, как демонизировать скрипты на Python в Unix-подобных системах: Рекомендации по упаковке Python Daemon

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

1 голос
/ 20 февраля 2017

Я попробовал launchctl и не смог заставить его работать в El Capitan, немного поискал и нашел этот пост

TL; DR

Используйте строку shebang #!/usr/bin/env python или #!/path/to/python в вашем сценарии

chmod +x test.py
nohup /path/to/test.py &
ps ax | grep test.py
1 голос
/ 01 марта 2012

Просто запустите скрипт Python в фоновом режиме, используя оболочку обычным способом:

python myscript.py &

Что касается вопроса об автозапуске, это было бы огромной дырой в безопасности, если бы это было то, что сделал Mac OS Xпо умолчанию так нет, конечно нет.Но вы могли бы легко написать скрипт, который реализовал что-то подобное нарочно: периодически ищите подключенный USB-накопитель и что-то делаете (даже запускайте второй сценарий с флэш-накопителя), когда он подключен.

0 голосов
/ 07 февраля 2018

Вы можете использовать nohup https://linux.die.net/man/1/nohup

$ nohup python <your_script.py> &

Это запустит ваш процесс и добавит вывод в файл nohup.out в том же каталоге & запустит скрипт в фоновом режиме, как объяснили другие ответы.

...