macosbashshellshutdown-hooksystem-shutdown

Run a script only at shutdown (not log off or restart) on Mac OS X


Is there any way to run a script only at shutdown?

I mean, only when the computer is really shutting down to off state. This script should not run when doing just a log off or restart.


Solution

  • Few days ago I published on github a configuration/script able to be executed at boot/shutdown.

    Basically on Mac OS X you could/should use a System wide and per-user daemon/agent configuration file (plist) in conjunction with a bash script file. This is a sample of the plist file you could use:

    <?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>boot.shutdown.script.name</string>
    
    <key>ProgramArguments</key>
    <array>
      <string>SCRIPT_PATH/boot-shutdown.sh</string>
    </array>
    
    <key>RunAtLoad</key>
    <true/>
    
    <key>StandardOutPath</key>
    <string>LOG_PATH/boot-shutdown.log</string>
    
    <key>StandardErrorPath</key>
    <string>LOG_PATH/boot-shutdown.err</string>
    
    </dict>
    </plist>
    

    You can place this file into /Library/LaunchDaemons. There are many directories where the plist file could be placed, it depends from what you need, the rights of the process and so on.

    ~/Library/LaunchAgents         Per-user agents provided by the user.
    /Library/LaunchAgents          Per-user agents provided by the administrator.
    /Library/LaunchDaemons         System wide daemons provided by the administrator.
    /System/Library/LaunchAgents   Mac OS X Per-user agents.
    /System/Library/LaunchDaemons  Mac OS X System wide daemons.
    

    This script boot-shutdown.sh will be loaded and executed at every boot/shutdown.

    #!/bin/bash
    function shutdown()
    {
    
      # INSERT HERE THE COMMAND YOU WANT EXECUTE AT SHUTDOWN OR SERVICE UNLOAD
    
      exit 0
    }
    
    function startup()
    {
    
      # INSERT HERE THE COMMAND YOU WANT EXECUTE AT STARTUP OR SERVICE LOAD
    
      tail -f /dev/null &
      wait $!
    }
    
    trap shutdown SIGTERM
    trap shutdown SIGKILL
    
    startup;
    

    Then call launchctl command which load and unload daemons/agents.

    sudo launchctl load -w /Library/LaunchDaemons/boot-shutdown-script.plist