Search code examples
macosbashstartuposx-maverickslaunching-application

Launchctl Start Interval


I know when using a plist in the launch daemons folder there is a key called <StartInterval>. I much prefer using launchctl when I can because it is a lot quicker then writing out a whole plist, but I have not been able to figure out how to get the process to restart after it has been killed. I have already read the man page and haven't found anything there. Is there a way? Typically I use the following command:

launchctl submit -l somename -p /path/to/script -o output.txt -e errors.txt

But that will not restart the program if it is killed after any time interval.


Solution

  • launchctl submit should already run the program again if it terminates for some reason:

     submit -l label [-p executable] [-o path] [-e path] -- command [args]
              A simple way of submitting a program to run without a configura-
              tion file. This mechanism also tells launchd to keep the program
              alive in the event of failure.
    
              -l label
                       What unique label to assign this job to launchd.
    
              -p program
                       What program to really execute, regardless of what fol-
                       lows the -- in the submit sub-command.
    
              -o path  Where to send the stdout of the program.
    
              -e path  Where to send the stderr of the program.
    

    To run a program again if it exits with an error, set the SuccessfulExit criteria for KeepAlive to false:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
      <key>Label</key>
      <string>test</string>
      <key>ProgramArguments</key>
      <array>
        <string>bash</string>
        <string>-c</string>
        <string>n=$((RANDOM%2));say $n;exit $n</string>
      </array>
      <key>KeepAlive</key>
      <dict>
        <key>SuccessfulExit</key>
        <false/>
      </dict>
      <key>StartInterval</key>
      <integer>60</integer>
    </dict>
    </plist>
    

    launchd throttles jobs so it takes about 10 seconds for the program to respawn.