¿Cómo ejecuto un comando launchd como root?

32

Tengo el siguiente comando launchctl como un archivo .plist. Está cargado y configurado para ejecutarse una vez al día, pero necesita ejecutarse como root y no estoy seguro de cómo verificar esto.

Además, este trabajo cron básicamente los CD en un directorio y ejecuta un comando. Estoy seguro de que launchd tiene una mejor manera de especificar el directorio donde se supone que debe ejecutar el comando.

¿Cómo sé que se ejecuta como root y hay una mejor manera de escribir esto?

<?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>dev.project.frontpage.feedparser</string>
    <key>ProgramArguments</key>
    <array>
        <string>cd</string>
        <string>/Users/eman/src/project/trunk/includes/;</string>
        <string>./feed-parser.php</string>
        <string>-c</string>
        <string>./feed-parser-config.xml</string>
    </array>
    <key>QueueDirectories</key>
    <array/>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>12</integer>
        <key>Minute</key>
        <integer>0</integer>
    </dict>
    <key>WatchPaths</key>
    <array/>
</dict>
</plist>
Emmanuel Mwangi
fuente

Respuestas:

46

¿En qué carpeta está .plistalmacenado?

launchdejecuta Daemons ( /Library/LaunchDaemonso /System/Library/LaunchDaemons) como root, y los ejecutará independientemente de si los usuarios han iniciado sesión o no. Los Agentes de lanzamiento ( /Library/LaunchAgents/o ~/Library/LaunchAgents/) se ejecutan cuando un usuario inicia sesión como ese usuario. No puede usar setuid para cambiar el usuario que ejecuta el script en demonios.

Debido a que querrá agregarlo /Library/LaunchDaemons, querrá asegurarse de cargarlo launchdcon privilegios de administrador (p. Ej. sudo launchctl load -w /Library/LaunchDaemons/com.apple.samplelaunchdscript.plist)

Echa un vistazo man launchdpara más información.

Chealion
fuente
Gracias. Esto es exactamente lo que estaba buscando en cuanto a responder al problema raíz. El script está en / Library / LaunchDaemons, por lo que ya se estaba ejecutando como root.
Emmanuel Mwangi el
Una pregunta para novatos: ¿se launchctlrequiere ejecutar para instalar un demonio? Quiero decir, ¿no es suficiente copiar el archivo plist en la ruta correspondiente?
Claudix
@Claudix: Eso es correcto. Copiar la configuración de launchd en su lugar no es suficiente: aún debe "encenderlo" (carga de launchctl)
Chealion
4

¿Has intentado usar uno de los editores de launchd?

Para asegurarme de que se ejecute como root, estoy bastante seguro de que launchd ejecutará los programas como root. ¿Alguna vez pensó en dar la propiedad del script a la raíz usando chmod? De esta manera, no se ejecutará a menos que se ejecute como root. Luego debe verificar que se ejecuta.

sudo chown root:admin script_to_run_by_launchd
hanleyp
fuente
Utilicé Lingon para escribir este guión. Y puedo afirmar que funciona bien en Leopard.
Emmanuel Mwangi el
3

Las listas de propiedades en LaunchAgents también funcionan, pero debe cargar tanto los agentes como los demonios con sudo:

sudo chown root /Library/LaunchAgents/test.plist
sudo launchctl load /Library/LaunchAgents/test.plist

Si el plist no tiene una clave deshabilitada, se carga en el siguiente inicio de sesión o se reinicia por defecto, y -wno es necesario.

Nota técnica TN2083: Demonios y agentes :

Un demonio es un programa que se ejecuta en segundo plano como parte del sistema general (es decir, no está vinculado a un usuario en particular). Un demonio no puede mostrar ninguna GUI; más específicamente, no está permitido conectarse al servidor de Windows.

[...]

Un agente es un proceso que se ejecuta en segundo plano en nombre de un usuario en particular. Los agentes son útiles porque pueden hacer cosas que los demonios no pueden hacer, como acceder de manera confiable al directorio de inicio del usuario o conectarse al servidor de Windows.

Lri
fuente
3

Para los Googlers que buscan ejecutar específicamente un Agente de lanzamiento con privilegios de root en lugar de un Daemon de lanzamiento , se puede hacer de la siguiente manera:

  • Crea tu LaunchAgent en ~/Library/LaunchAgents
  • Ejecute su aplicación con a sudotravés de la ProgramArgumentspropiedad en su lista
  • Establezca la NOPASSWDopción para su aplicación en/etc/resolvers.d

Para más detalles, vea esto y esta respuesta.

Cory Klein
fuente
2

LaunchControl me hizo sin dolor en Yosemite. Tiene una buena GUI de arrastrar y soltar para ayudarlo a crear o editar servicios. Fue sorprendente ver todos los servicios en ejecución que no conocía.

Pasos

  1. Iniciar LaunchControl
  2. Cambio en la parte superior izquierda a GlobalDeamons e ingrese su contraseña de administrador
  3. Archivo-> Nuevo
  4. Bajo etiqueta, dale un nombre único. La convención es "com.company.appname"
  5. En Programa para ejecutar, use la secuencia de comandos de Unix Shell o cualquier comando que prefiera SIN argumentos
  6. Si su aplicación requiere argumentos, cambie el campo desplegable de "Argumento predeterminado" a "Argumento personalizado"
    1. ahora proporcione el argumento que haría normalmente ya que lo ejecutaría desde la línea de comando real.
  7. Ejecutar en carga es opcional, usted decide.
  8. Desde el lado derecho, arrastre y suelte StartInterval y configure el intervalo que desee. Las preguntas frecuentes en el menú Ayuda son muy buenas.
Jose Leon
fuente
¿Puedes editar tu publicación para incluir los pasos que puede seguir el autor de la pregunta para resolver su problema?
Cfinley