Submit Hint Search The Forums LinksStatsPollsHeadlinesRSS
14,000 hints and counting!


Click here to return to the '10.5: Automatically restart a crashed program' hint
The following comments are owned by whoever posted them. This site is not responsible for what they say.
10.5: Automatically restart a crashed program
Authored by: macavenger on Dec 19, '07 09:10:55AM

If you are going to be using a LaunchAgent anyway, why not just set up the launchAgent to run the app? That is, after all what it is designed to do-launch an application/script/etc and keep it running, restarting it if it crashes. Works quite nicely, and Lingon makes it easy to set up. There is even a flag you can set to say "Only relaunch this application if it crashes, not if it exits cleanly", so you can still exit out of the application manually if you want. If you didn't want the application to open immediately on login, it would probably still be easier and cleaner to simply write a basic script to load/unload the LaunchAgent when desired, rather than writing a complicated script to watch files.

---
Aluminum iMac 20" 2.4 GHz/3GB/300GB HD



[ Reply to This | # ]
10.5: Automatically restart a crashed program
Authored by: mark hunte on Dec 19, '07 11:33:28AM

This hint is for when the app crashes nor when you quit. Keep always running is not the aim.

Show me where you see 'Only when it crashes', Because in Lingon for Leopard there is no such options AFAICS

---
mh



[ Reply to This | # ]
10.5: Automatically restart a crashed program
Authored by: macavenger on Dec 19, '07 01:48:20PM
This hint is for when the app crashes nor when you quit. Keep always running is not the aim.
As I noted in my comment, you can do this through launchd
Show me where you see 'Only when it crashes', Because in Lingon for Leopard there is no such options AFAICS
from the launchd.plist man page (which has all the configuration options you can put into a LaunchAgent or LaunchDaemon plist file):
KeepAlive [boolean or dictionary of stuff]
This optional key is used to control whether your job is to be kept continuously running or to let demand and conditions control the invocation.
[...SNIP...]

    SuccessfulExit [boolean]
    If true, the job will be restarted as long as the program exits and with an exit status of zero. If false, the job will be restarted in the inverse condition.
It looks like Lingon may not have this key easily available, but it most certainly is an option through launchd.

---
Aluminum iMac 20" 2.4 GHz/3GB/300GB HD

[ Reply to This | # ]

10.5: Automatically restart a crashed program
Authored by: macavenger on Dec 19, '07 02:00:36PM
Show me where you see 'Only when it crashes', Because in Lingon for Leopard there is no such options AFAICS
Ok, yeah. The newest version of Lingon apparently doesn't have this option. Actually, the latest version is a bit of a step back from the older ones I've used in terms of flexibility and power. In the previous version you could put multi-line commands in on the main screen, and it had a custom editor as well if you wanted to edit the .plist directly. The current version is easier to use for basic stuff, but not as good for advanced stuff. Unless, of course, I am missing something, in which case please correct me :) So yeah, you would need to edit the .plist file directly to add this key.

---
Aluminum iMac 20" 2.4 GHz/3GB/300GB HD

[ Reply to This | # ]

10.5: Automatically restart a crashed program
Authored by: mark hunte on Dec 19, '07 05:33:17PM

Now I am not going to even suggest I am an expert,
SuccessfulExit sound like what we are looking for, but Does it work.
I have tried the SuccessfulExit key true and false, with and without KeepAlive true. It does not work
So please show us how you would do it, ( keeping the app running when it crashes but letting it stay quit when you quit it.)

---
mh



[ Reply to This | # ]
10.5: Automatically restart a crashed program
Authored by: macavenger on Dec 20, '07 09:38:54AM
I have tried the SuccessfulExit key true and false, with and without KeepAlive true. It does not work So please show us how you would do it, ( keeping the app running when it crashes but letting it stay quit when you quit it.)
The key here is that KeepAlive can be either a bool OR a dict- in this case we need it to be a dict, with the SuccessfulExit key as a child bool set to false. So, using my company's flight management software as an example, you would end up with the following LaunchAgent .plist file (I put it in my home library/LaunchAgents folder):
<?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>KeepAlive</key>
	<dict>
		<key>SuccessfulExit</key>
		<false/>
	</dict>
	<key>Label</key>
	<string>com.frontierflying.flightmaster</string>
	<key>ProgramArguments</key>
	<array>
		<string>/Users/Shared/FlightMasterStandalone/FlightMaster2004.app/Contents/MacOS/EXE</string>
	</array>
</dict>
</plist>
I made the inital file using Lingon, and then simply edited it to add the KeepAlive dict/key set. The program arguments string needs to be the path to the actual executable inside the app bundle, not just to the .app (assuming it is a bundle app) as shown.

Of course, this loads immediately at login. If this is the desired behavior, then you are done. If you don't want this, then put the .plist file in your documents directory or something, and use something like the following two line script to load it as desired:

launchctl unload /path/to/launchagent.plist
launchctl load /path/to/launchagent.plst
The unload command is needed only if you want to launch the application multiple times in a session. From what I can tell, once loaded the LaunchAgent remains loaded, and simply stops monitoring the app after it quits cleanly- but doesn't unload. In order to relaunch the app, you first have to unload the LaunchAgent, the load it again, thus the first line of the script. That script should be able to be put into an apple script using the "do shell script" apple script command if you want (although I didn't test this), or just leave it as a terminal script. Then just run that script, and launchd will launch your application, monitor it, and restart it if it crashes, but not if it exits cleanly. Perhaps in the end this isn't all that much simpler than your method, but it feels cleaner to me.

---
Aluminum iMac 20" 2.4 GHz/3GB/300GB HD

[ Reply to This | # ]

10.5: Automatically restart a crashed program
Authored by: mark hunte on Dec 20, '07 12:50:54PM

Thanks for explaining all that macavenger, I will check it out.

---
mh



[ Reply to This | # ]