Is there any way to keep my Python script (with an endless 'while' loop) running in the background on OS X? Also, for the same purpose, is there any way to have "autorun" python script on a USB drive?
See Question&Answers more detail:osIs there any way to keep my Python script (with an endless 'while' loop) running in the background on OS X? Also, for the same purpose, is there any way to have "autorun" python script on a USB drive?
See Question&Answers more detail:osIf you want to have the script running as a daemon process which starts automatically, you can use launchctl and a plist file.
For example, Bob has a simple python script which writes the word 'foo' to a file every second in his home directory:
#!/usr/bin/env python
import os
import time
while True:
os.system('echo " foo" >> /Users/bob/foostore.txt')
time.sleep(1)
To have it run as a daemon process, create a plist file, ~/Library/LaunchAgents/com.bobbob.osx.test.plist
, with the contents:
<?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>
Then use launchctl
to load the plist from a terminal:
launchctl load ~/Library/LaunchAgents/com.bobbob.osx.test.plist
This will load that script and immediately run the program in the <string>
element beneath <key>Program</key>
. You can also specify arguments for the program using a <ProgramArguments>
node with an array of <string>
elements. For more information see the launchd.plist man page
If you want to remove the script, you can use the unload command of launchctl
:
launchctl unload ~/Library/LaunchAgents/com.bobbob.osx.test.plist
The Label used in the script can be anything, but it should be unique on your system, so Apple generally uses a reversed domain name.
As for autorunning a script, I don't think there's any way to do that.