Realmente no tengo idea. Hay una mención de /etc/rc.shutdown.local
en /System/Library/LaunchDaemons/com.apple.SystemStarter.plist
, pero no estoy del todo seguro de lo que significa. La página del manual para SystemStarter
no es de gran ayuda, además de informarnos que está en desuso. Sin embargo, el programa se está ejecutando en mi sistema. Ah, y la cadena /etc/rc.shutdown.local
también se encuentra dentro del binario SystemStarter
. Mi conjetura es que los archivos se ejecutarán en el cierre.
Pero si puedo responder a tu pregunta implícita de cómo ejecutar algo en el cierre: Esto es lo que he hecho. Primero, escribí y compilé este pequeño programa en C. Lo que hace es simplemente dormir hasta que recibe un SIGTERM, momento en el que ejecuta sus argumentos:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
char **args;
void sigterm(int s) {
execvp(args[1],args+1);
fprintf(stderr, "%s: exec failed: ", args[0]);
perror(args[1]);
exit(1);
}
int main(int argc, char *argv[]) {
args=argv;
signal(SIGTERM,sigterm);
for (;;) sleep(0x7FFFFFFF);
}
Tengo un demonio de inicio configurado para ejecutar este programa al inicio. Cuando llegue el momento de la parada, launchd
enviará el SIGTERM que hace que el programa haga su trabajo. Por supuesto, tiene que hacerlo bastante rápido, o launchd
aplicará un martillo más grande.
Aquí está mi launchctl
plist, llamado no.ntnu.math.hanche.quietboot.plist
y colocado en /Library/LaunchDaemons/
. Su único propósito es ejecutar 'nvram SystemAdioVolume =% 01' en el cierre, para que pueda reiniciar sin el timbre.
<?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>no.ntnu.math.hanche.quietboot</string>
<key>ProgramArguments</key>
<array>
<string>/local/bin/atshutdown</string>
<string>/usr/sbin/nvram</string>
<string>SystemAudioVolume=%01</string>
</array>
<key>Disabled</key>
<false/>
<key>KeepAlive</key>
<false/>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>