[launchd-dev] fork & exit in Shell Script (Revisited)

Charles Darwin DarwinsKernel at gmail.com
Wed Nov 19 09:51:43 PST 2008


On Nov 13, 2008, at 1:00 PM, Quinn wrote:

> At 8:28 -0500 11/11/08, Charles Darwin wrote:
>> "In Mac OS X v10.4, launchd was added. This is the preferred means  
>> of adding background agents on a per-user basis. "
>>
>> that I found here:
>>
>> <http://developer.apple.com/documentation/MacOSX/Conceptual/ 
>> BPSystemStartup/Articles/CustomLogin.html#//apple_ref/doc/uid/ 
>> 20002134>
>
> That's probably true, but there are certain advantages to using a  
> login item, namely that a login item doesn't have to be code: it  
> can be anything that the Finder can open.  You can solve this  
> probably with no code by simply creating an alias to the server  
> volume in question and adding that alias to the login item list.
>
> And it turns out that mounting AFP volumes from a shell script is  
> tricky.  If you want the volume to act like it's been mounted via  
> standard means, you can't just use mount_afp -- you have to make  
> sure that Disk Arbitration knows about the volume, and that means  
> mounting it using higher level software.  Mounting a server volume  
> programmatically is best done using FSMountServerVolumeSync/Async.
>
>                    *                   *                   *
>
> Still, if you want a launchd agent that runs when the user logs in,  
> does its job, then quits and isn't relaunched for that session,  
> it's pretty easy to construct one.
>
> $ ls -l MyScript.sh
> -rwxr-xr-x  1 quinn  staff  63 Nov 13 17:44 MyScript.sh
> $ cat MyScript.sh
> #! /bin/sh
>
> echo "MyScript start"
> sleep 10
> echo "MyScript end"
> $ cat Library/LaunchAgents/com.apple.dts.MyScript.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.apple.MyScript</string>
>         <key>LimitLoadToSessionType</key>
>         <string>Aqua</string>
>         <key>RunAtLoad</key>
>         <true/>
> 	<key>ProgramArguments</key>
> 	<array>
> 		<string>/Users/quinn/MyScript.sh</string>
> 	</array>
> </dict>
> </plist>
>
> The "LimitLoadToSessionType" of "Aqua" ensures that the job is only  
> loaded into GUI sessions.  The "RunAtLoad" of true means that the  
> job is run once when it's loaded (that is, when the GUI session is  
> started).  And the absence of "KeepAlive" or "OnDemand" means that  
> the job is not automatically relaunched when it exits.
>
> S+E
>

LimitLoadToSessionType doesn't do it either. It seems that if I have  
RunAtLoad then it doesn't matter whether LimitLoadToSessionType is  
there or not. I would like my LaunchAgent to act "much like a login  
item" which is what is reads here:

<http://developer.apple.com/technotes/tn2005/ 
tn2083.html#SECLAUNCHDAGENT>

Charles



More information about the launchd-dev mailing list