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

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

Ответ 1

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

Например, у Боба есть простой python script, который записывает слово "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 для загрузки plist из терминала:

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

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

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

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

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

Что касается autorunning a script, я не думаю, что есть способ сделать это.

Ответ 3

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

python myscript.py &

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

Ответ 4

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

TL; DR

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

chmod +x test.py
nohup /path/to/test.py &
ps ax | grep test.py

Ответ 5

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

$ nohup python <your_script.py> &

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