¿Cómo modificar un Launch Daemon permanentemente bajo OS X El Capitan?

Modifiqué el org.postfix.master.plist predeterminado de postfix para que se ejecute como un demonio , de modo que pueda enviarme un correo electrónico cada vez que un usuario local reciba un correo.

Por defecto:

<?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>org.postfix.master</string>
    <key>Program</key>
    <string>/usr/libexec/postfix/master</string>
    <key>ProgramArguments</key>
    <array>
        <string>master</string>
        <string>-e</string>
        <string>60</string>
    </array>
    <key>QueueDirectories</key>
    <array>
        <string>/var/spool/postfix/maildrop</string>
    </array>
    <key>AbandonProcessGroup</key>
    <true/>
</dict>
</plist>

Modificado:

<?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>KeepAlive</key>
        <true/>
        <key>Label</key>
        <string>org.postfix.master</string>
        <key>Program</key>
        <string>/usr/libexec/postfix/master</string>
        <key>ProgramArguments</key>
        <array>
                <string>master</string>
        </array>
        <key>QueueDirectories</key>
        <array>
                <string>/var/spool/postfix/maildrop</string>
        </array>
        <key>AbandonProcessGroup</key>
        <true/>
</dict>
</plist>

Sin embargo, este archivo está bajo /System/Library/LaunchDaemons/, por lo que tuve que desactivar SIP temporalmente para modificar el archivo. Leí que después de la próxima actualización del sistema operativo, todos mis cambios desaparecerán debido a SIP. ¿Qué puedo hacer para que esto sea permanente? ¿Puedo poner mi Launch Daemon /Library/LaunchDaemonscomo segundo?

Respuestas (2)

Todavía no he tenido que lidiar con esto "de verdad", pero creo que la mejor solución es:

  1. Copie el archivo .plist en /Library/LaunchDaemons.
  2. Cambie el nombre (por ejemplo, agregando "local" al comienzo del nombre del archivo) y edite su Labelvalor para que coincida. Si no cambia esto, es probable que launchd se confunda entre este y el original.
  3. Haz cualquier otra edición que necesites
  4. Asegúrese de que la propiedad esté establecida en root:wheel y los permisos en 644.
  5. Desactive el elemento original con eg sudo launchctl unload -w /System/Library/LaunchDaemons/org.postfix.master.plist(lo -whace permanente).
  6. Cargue su reemplazo personalizado con, por ejemplo sudo launchctl load /Library/LaunchDaemons/local.org.postfix.master.plist, (o simplemente reinicie).

Por cierto, si simplemente deshabilita SIP y modifica el archivo existente, no necesariamente será revertido por una actualización del sistema operativo. Pero podría , y tendría que verificar después de cada actualización (incluidas las actualizaciones de seguridad, etc.), lo cual es una molestia.

Tu solución funciona. Cambiar el Labelvalor es realmente importante. De lo contrario, el daemon no se iniciará.

Tuve un problema similar, y lo anterior no lo solucionó. Estoy compartiendo mi comida para llevar, si alguna vez puede ahorrarle algo de tiempo a alguien (luché durante algunas horas con eso)

Tldr: tuve que ejecutar mi plist como root


En mi caso, el plist cargaba correctamente desde la Terminal:

sudo launchctl load /Library/LaunchAgents/com.name.of.the.plist

Pero no lo hizo después de reiniciar la computadora. Por cierto, puedes verificar si tu plist está cargado con lo siguiente:

sudo launchctl list | grep "my.plist"

Vi exactamente el error al agregar registros:

<key>StandardErrorPath</key>
<string>/Users/XXX/err.log</string>
<key>StandardOutPath</key>
<string>/Users/XXX/out.log</string>

Reveló este mensaje de error:

sysadminctl[807:9587] sysadminctl should be run as root, or in interactive mode!

Realmente pensé que mi secuencia de comandos ya se estaba ejecutando como root (debido a que estaba en /Library/LaunchAgents/), pero no fue así, ¡y mi secuencia de comandos estaba teniendo un problema de permiso!

Ahora, para ejecutar el plist como root:

  • Mover el plist de /Library/LaunchAgents/a/Library/LaunchDaemons/
  • Agregue la UserNameclave de la siguiente manera:
<key>UserName</key>
<string>root</string>

En mi caso funcionó bien!