En el seguimiento de este caso, cuatro puntos se presentaron. Cada uno de ellos, por derecho propio, es todo un tema. Dos de ellos ya los he expuesto.
Salvo Postfix, los otros tres han costado trabajo para obtener información (o no la hay o ésta se encuentra dispersa en el «colectivo desarrollador»). Así, grosso modo, la cadena de eventos que se ha suscitado ha sido:
- El mensaje de que «por un problema se hizo un restart o shutdown» en el equipo, aunque éste haya sido por otras razones (manualmente y controlado), fue lo que nos llevo a indagar sobre el origen del archivo que dispara este mensaje:
spindump.
- El archivo que genera
spindumpincluye muchas aplicaciones. Puede ser que todas ellas tengan problemas o que sólo sea una de ellas la causa (todavía hay que aprender y entender mucho sobre lo quespindumpgenera). - A fin de recolectar datos (por el momento sólo extrayendo sólo los nombres de las aplicaciones reportadas) se optó por extraer éstos del último archivo generado y los datos enviarlos por correo.

- La estrategia seleccionada llevó a preguntarse cómo poder hacer el envío de correo y de ahí que apareció Postfix.

- Resuelto el asunto del envío del correo, se presentó otro problema. ¿Cómo hacer que esta recolección de datos se hiciera tras encender o firmarse en el sistema? Esto llevó a indagar sobre
launchctl. - Finalmente un problema de permisos apareció y hubo que documentarse sobre los Directory Services.
Así que, brevemente expondré esos puntos restantes.
Directory Services
A diferencia de otros unices, en los que la administración de cuentas se hace con un grupo de comandos que, en general, suelen encontrarse sin mucha variación, Apple adoptó para Mac OS X los servicios de directorio de NeXT, pero buscando algo aún mucho más flexible, Apple implementó el modelo de servicios de directorio LDAP bajo el nombre Apple Open Directory1. La administración de estos servicios requieren algo más que un grupo de comandos y de ahí que haya una familia de estos.
La necesidad de lidiar con esto surge de la tenencia y permisos sobre los archivos generados por spindump. Aunque podrían considerarse varias alternativas para esto, lo cierto es que sólo dos de ellas son las más viables (pero una de ella no es la adecuada): volver administrador del equipo a la cuenta de usuario con la que normalmente trabajo o agregar dicha cuenta al grupo con el que son generados los archivos. La menos permisiva es la segunda y por tanto es la correcta. Así, desde la cuenta de administración del equipo (donde user corresponde a la cuenta a agregar al grupo _analyticsusers):
$ dseditgroup -o edit -t user -a user -p _analyticsusers Please enter user password: $ dseditgroup -o member _analyticsusers dsAttrTypeStandard:GroupMembership - _analyticsd _networkd _timed _reportmemoryexception _mbsetupuser user ... $ dseditgroup -o checkmember -t user -a user _analyticsusers yes user is a member of _analyticsusers
launchd
A diferencia de otros unices (si ya sé que es repetitivo pero así es), donde el primer proceso es init, en Darwin (a.k.a., Mac OS X, OS X, macOS) tenemos a launchd, quien a diferencia de init, absorbe mucho de lo que init delega en otros demonios, siendo una de ellas la ejecución de programas cuando el usuario se firma en el equipo.
Para poder indicarle a launchd que ejecute algo al inicio de sesión se necesita un properties list (un archivo de extensión .plist) que después de buscar en la Internet, encontré un ejemplo:
<?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>com.user.loginscript</string>
<key>ProgramArguments</key>
<array><string>/path/to/executable/script.sh</string></array>
<key>RunAtLoad</key><true/>
</dict>
</plist>
a este ejemplo sólo le hice falta algo que es muy particular de mi caso, donde quiero hacer uso del servicio de correo. Resulta que cuando launchd termina con el programa que se le ha indicado correr, también termina con los hijos que éste haya tenido si hay uno por ahí todavía. En este caso el servicio de correo. La acción es tan rápida que no da oportunidad a mail de terminar su labor. Por lo que es necesario agregar
<key>AbandonProcessGroup</key><true/>
al PLIST que se ha creado (yo lo hice como la última llave del diccionario). El PLIST debe ser colocado en ~/Library/LaunchAgents/com.user.loginscript.plist y cargado con launchctl load ~/Library/LaunchAgents/com.user.loginscript.plist (se puede probar con launchctl start com.user.loginscript). Ver las referencias 2 y 3 para conocer un poco más al respecto.
Referencias
- Edward Marczak, «Easing Into dscl. Manipulating Directory Services via the Command Line«, MacTech, Vol. 22, No. 10, 2006. URL: http://preserve.mactech.com/articles/mactech/Vol.22/22.10/2210MacInTheShell/index.html.
- Babo Dee, «Launchctl 2.0 syntax», Babo D’s Corner, blog. Published 2016.04.09; visited: 2023.06.15. URL: https://babodee.wordpress.com/2016/04/09/launchctl-2-0-syntax/.
- Jonathan Levin, «», MacSysAdmin 2014, conference presentation. Reviewed: 2023.06.15. URL: https://docs.macsysadmin.se/2014/pdf/Launchd_-_At_your_service.pdf and https://docs.macsysadmin.se/2014/video/Day4Session3.mp4.
