No se puede iniciar daemon con launchctl en Yosemite

27

Tengo un demonio launchd colocado ~/Library/LaunchAgentsque funcionó bien en Mavericks. Pero no comenzará en la versión beta pública de Yosemite. El daemon plist es así (mi nombre de usuario es darksaircon UID 501)

<?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.darksair.retrmail</string>
    <key>ProgramArguments</key>
    <array>
      <string>/Users/darksair/bin/retrmail.py</string>
    </array>
    <key>KeepAlive</key>
    <false/>
    <key>StartInterval</key>
    <integer>300</integer>
    <key>LaunchOnlyOnce</key>
    <false/>
    <key>UserName</key>
    <string>darksair</string>
    <key>ProcessType</key>
    <string>Standard</string>
    <key>EnvironmentVariables</key>
    <dict>
      <key>PATH</key>
      <string>/Users/darksair/Python/bin:/Users/darksair/Python3/bin:/Users/darksair/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
    </dict>
    <key>StandardOutPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
    <key>StandardErrorPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
  </dict>
</plist>

Básicamente se supone que se ejecuta ~/bin/retrmail.pycada 5 minutos.

Noté que en Yosemite launchd se actualiza a 2.0, y launchctl tiene nuevos comandos. Lo intenté

sudo launchctl kickstart user/501/org.darksair.retrmail

y dijo

Could not find service "org.darksair.retrmail" in domain for uid: 501

También probé la vieja escuela

sudo launchctl load ~/Library/LaunchAgents/retrmail.plist

y dijo

/Users/darksair/Library/LaunchAgents/retrmail.plist: Path had bad ownership/permissions

El archivo es de mi propiedad y del grupo de personal. Intenté tanto el permiso 644 como el 600 con el mismo error.

Entonces, ¿alguien sabe cómo encender correctamente un demonio de lanzamiento en Yosemite?


ACTUALIZACIÓN: Parece que mi archivo de agente de lanzamiento debe ser propiedad de root:wheel. Después de que traje, intenté

sudo launchctl load ~/Library/LaunchAgents/retrmail.plist

y no emitió ningún error. Y creo que mi demonio está funcionando correctamente. Dejaré esta pregunta abierta porque recuerdo que el documento launchd establece claramente que el archivo del agente de lanzamiento puede ser propiedad del usuario que ejecuta el daemon.


ACTUALIZACIÓN2: No, no se estaba ejecutando correctamente. Se ejecutó solo una vez, pero no nuevamente, como si estuviera descargado.


ACTUALIZACIÓN3: Actualicé a Yosemite public beta 3, y cambié mi agente a esto

<?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.darksair.retrmail</string>
    <key>ProgramArguments</key>
    <array>
      <string>/Users/darksair/bin/retrmail.py</string>
    </array>
    <key>StartInterval</key>
    <integer>300</integer>
    <key>UserName</key>
    <string>darksair</string>
    <key>EnvironmentVariables</key>
    <dict>
      <key>PATH</key>
      <string>/Users/darksair/Python/bin:/Users/darksair/Python3/bin:/Users/darksair/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
    </dict>
    <key>StandardOutPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
    <key>StandardErrorPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
  </dict>
</plist>

Recargué este agente y creo que ahora funciona correctamente. Todavía dejo esta pregunta abierta porque no sé qué tiene de malo mi plist anterior.


En conclusión, lo que encontré es que tengo que cambiar el propietario del plist para root:wheelpoder cargarlo.

MetroWind
fuente
¿Funciona esto en Yosemite final?
TJ Luoma
@TJLuoma: sí. Siempre que el plist sea propiedad de root: wheel.
MetroWind

Respuestas:

21

Desde man launchctl

Tenga en cuenta que los archivos de configuración por usuario (LaunchAgents) deben ser propiedad de root (si están ubicados en / Library / LaunchAgents) o del usuario que los carga (si están ubicados en $ HOME / Library / LaunchAgents). Todos los demonios de todo el sistema (LaunchDaemons) deben ser propiedad de root. Los archivos de configuración no deben permitir escrituras grupales y mundiales. Estas restricciones existen por razones de seguridad, ya que permitir la escritura en un archivo de configuración de launchd permite especificar qué ejecutable se lanzará.

Fix es

sudo chmod 600 /Library/LaunchDaemons/x.plist
sudo chown root /Library/LaunchDaemons/x.plist
diimdeep
fuente
2
"O el usuario los está cargando" <- Esta es la parte con la que tengo problemas.
MetroWind
2
No soy un tipo de Unix, pero dice "no permitir el grupo y el mundo escribe". Dado que aún puede necesitar leerse, ¿no debería ser así chmod 644?
Jason
5

Por extraño que parezca, usar sudoera su problema. Al usarlo sudo, ya no era usted mismo, por lo que no era el propietario de su propio archivo. Elimine sudo, repita el comando y debería cargarse bien. Perdón por el enfoque filosófico de todo.

AlexPantea
fuente
4

Encontré la solución.

El comando correcto en este caso es

launchctl bootstrap gui/501 ~/Library/LaunchAgents/retrmail.plist

Y para descargar,

launchctl bootout gui/501 ~/Library/LaunchAgents/retrmail.plist

Sin launchctl loadembargo, no sé por qué requiere root, pero la carga / descarga está en desuso de todos modos.

MetroWind
fuente
La página de manual enumera el arranque, no el arranque Creo que la autocorrección te consiguió ya que en mi máquina cambia bootout a bootcut.
Steve Moser
@MetroWind que obtengo No se pudo encontrar el dominio para el error Código = 112 con el comando anterior. No es consistente. Cualquier pista ?
Parag Bafna
¿Aún necesitabas el chmod& chown?
Itachi
@ Itachi, no. Dejar el propietario y el permiso predeterminados debería estar bien.
MetroWind
@ParagBafna, no estoy seguro. ¿Quizás su UID no es 501?
MetroWind
3

Me encontré con esto también, tratando de usar el usuario, no la raíz .plist (como uno debería poder hacer)

$ load ~/Library/LaunchAgents/com.blash.blah.plist
Could not find domain for 

Fui enviado a esta máquina de forma remota mientras NO estaba conectado en la consola (sin cabeza), lo que parecía ser mi problema: al menos los servicios administrados por el usuario necesitan que el usuario haya iniciado sesión en la pantalla principal (terminé haciendo iniciar sesión a través de la administración remota, ya que esta es una máquina sin cabeza)

OMI, si desea que esto se ejecute incluso si no está personalmente allí para iniciar sesión, sus opciones son:

  • Inicie sesión en su cuenta automáticamente (tenga en cuenta la implicación de seguridad, también sin la etiqueta UserName como se indica en una de las respuestas)

  • Haga que los archivos pertenezcan a la raíz como se indica en las diversas sugerencias (estableciendo que el usuario vuelva a ser efectivo con el nombre de usuario como ya lo hizo)

nhed
fuente
2
Muchas gracias. He encontrado solución en tu respuesta.
Retraut
2

Aquí hay una idea tonta.

Acabo de tener el mismo error, también después de haber actualizado a Yosemite. Asumí erróneamente que significaba una mala propiedad / permisos en el archivo .plist, cuando de hecho, por alguna razón, el binario al que hacía referencia en el plist (en mi caso Cassandra), había perdido su bit ejecutable.

chmod + x'ing lo arregló.

Probablemente no sea tu problema, pero valdría la pena intentarlo :)

DanielSmedegaardBuus
fuente
Sin embargo, esto no se aplica a mi caso. Mi ejecutable tiene el bit de permiso x. Pero gracias por la respuesta de todos modos. Espero que pueda ayudar a otras personas.
MetroWind
2

Retire la UserNamellave y la cuerda.

El problema es que la UserNameclave solo se puede usar si el proceso se inicia desde la raíz. Solo se puede iniciar como root si el plist es propiedad de root. Básicamente, el proceso se inicia por root y luego se suide al usuario especificado. Si desea que este proceso se ejecute como usted mismo, coloque el plist en su carpeta ~ / Library / LaunchAgents y elimine la clave UserName.

Peter T Bosse II
fuente
Funciona después de eliminar la opción 'UserName' para zabbix_agend. ¡Gracias! - gist.github.com/chusiang/04db38f5173784e33b68
Chu-Saing Lai el
Extraño ... Todavía no se cargará después de que
eliminé la
1

¿Intentaba volver a cargar manualmente un agente que tenía permisos de usuario? No entiendo completamente por qué se requiere nada de esto, pero creo que debe estar conectado al dominio de sus usuarios (que parece que no está conectado cuando se ejecuta como root). Usar estas funciones para volver a conectar funcionó para mí.

function as_user {
    local user="$1"
    local user_pid=$(ps -axj | awk "/^$user / {print \$2;exit}")
    local command="sudo launchctl bsexec $user_pid sudo -u '$user' $2"
    echo "Running:"
    echo "$command"
    eval $command
}

function as_current_user {
    as_user "$(whoami)" "$*"
}

function reload_agent {
    as_current_user launchctl unload "$1"
    as_current_user launchctl load "$1"
}

Usaría esto de la siguiente manera:

reload_agent ~/Library/LaunchAgents/com.hw.helloworld.plist

Bsexec lo vuelve a colocar en su dominio y le permite agregar la tarea como un iniciador de usuario.

imalison
fuente
Dice: /Users/darksair/Library/LaunchAgents/retrmail.plist: operación ya en progreso. En este punto, mis preguntas son básicamente: ¿por qué no funcionó el comando kickstart? ¿Y por qué tengo que configurar la propiedad plist a raíz ...?
MetroWind
1
NO debe establecer que el propietario de su archivo plist sea root; todo en ~ / Library / LaunchAgents debe ser propiedad del usuario al que pertenece ese directorio. Obtuve la operación ya en progreso cuando no descargué el comando antes de cargarlo. ¿Estás utilizando la función que proporcioné?
Imalison
Sí. Estaba usando tus funciones. Y descargué el plist primero ...
MetroWind
Intenté cargar la primera lista que proporcionaste y funcionó para mí. ¿Qué permisos se establecen para el archivo?
imalison
Este es un código increíble para muchas cosas. Estoy usando una mezcla de títeres y scripts de bash personalizados para administrar muchos dispositivos macOS diferentes, y los problemas aleatorios porque la sesión de auditoría de seguridad o el dominio del usuario no son correctos son muy comunes. ¡Buen trabajo!
Andrew White