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?
5 Answers
If 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.
See this question for ways to daemonizing python scripts on Unix like systems: Python Daemon Packaging Best Practices
Of course you can always run the script in the background as mentioned by kindall if that is all you need.
You can use nohup https://linux.die.net/man/1/nohup
$ nohup python <your_script.py> &
This will run your process and append the output to a file nohup.out in the same directory. & will run the script in the background as explained by other answers.

- 1,605
- 13
- 20
Just run your Python script in the background using the shell in the usual way:
python myscript.py &
As for the autorun question, this would be a huge security hole if it was something that Mac OS X did by default, so, no, of course not. But you could easily write a script that implemented something like that on purpose: periodically look for a USB drive plugged in, and do something (even run a second script from the thumb drive) when it's plugged in.

- 178,883
- 35
- 278
- 309
-
1
-
Yeah, you're right. I never close my shells so I didn't consider that. A better option might be an AppleScript applet that launches the script. – kindall Mar 01 '12 at 19:36