Есть ли способ сохранить мой Python script (с бесконечным циклом while), работающим в фоновом режиме на OS X? Кроме того, с той же целью есть ли способ "autorun" python script на USB-накопителе?
Запуск Python в фоновом режиме на OS X
Ответ 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, я не думаю, что есть способ сделать это.
Ответ 2
См. этот вопрос о способах демонстрации сценариев python в системах Unix: Практические советы по упаковке Dython для Python
Конечно, вы всегда можете запустить 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 в фоновом режиме, как объясняется другими ответами.