Começar a usar o launchctl definitivamente pode ser uma experiência frustrante. Eu encontrei muitos artigos explicando o que você deve fazer, mas poucas amostras para download. Aqui está um LaunchDaemon simples que esperamos ser um bom ponto de partida. Você pode apenas baixar os arquivos aqui se não quiser copiar e colar.
Observação: você precisa substituir MY_USER_NAME pelo seu nome de usuário. O plist precisa encontrar seu script.
// at ~/Desktop/testdaemon/com.wintr.eodemail.plist
<?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>com.wintr.eodemail</string>
<key>Program</key>
<string>/Users/MY_USER_NAME/Desktop/testdaemon/testdaemon.sh</string>
<key>StandardErrorPath</key>
<string>/var/log/eod-email.log</string>
<key>StandardOutPath</key>
<string>/var/log/eod-email.log</string>
<key>RunAtLoad</key>
<true/>
<key>StartInterval</key>
<integer>15</integer>
</dict>
</plist>
Este é um script de daemon simples que anexará o datetime a um arquivo em sua área de trabalho. Observação: como o script é executado como root, o til (~) não será o diretório inicial esperado.
// at ~/Desktop/testdaemon/testdaemon.sh
#!/bin/sh
home="/Users/MYUSERNAME" ## note -- this will be run as root, ~ is not your normal user
now=$(date "+%Y-%m-%d %H.%M.%S")
echo $now >> "$home/Desktop/TestFile.txt"
Finalmente, eu sempre escrevo um pequeno shell script para instalar o LaunchDaemons, já que é fácil cometer um erro. Como o launchctl executa seu script como root, é necessário que as permissões do script não sejam graváveis por outras pessoas, uma vez que isso basicamente lhes dará privilégios de root.
// ~/Desktop/testdaemon/install.sh
#!/bin/sh -e
plist_path="com.wintr.eodemail.plist"
plist_filename=$(basename "$plist_path")
install_path="/Library/LaunchDaemons/$plist_filename"
echo "installing launchctl plist: $plist_path --> $install_path"
sudo cp -f "$plist_path" "$install_path"
sudo chown root "$install_path"
sudo chmod 644 "$install_path"
sudo launchctl unload "$install_path"
sudo launchctl load "$install_path"
echo "to check if it's running, run this command: sudo launchctl list | grep wintr"
echo "to uninstall, run this command: sudo launchctl unload \"$install_path\""