Dado un shell script que llama a la utilidad de captura de pantalla de MacOS, se produce una captura de pantalla adecuada (es decir, una captura completa de lo que hay en la pantalla, incluyendo cualquier aplicación Windows visible) cuando se llama a ese shell script desde el terminal. Sin embargo, el uso de launchd para llamar periódicamente a la misma script no produce el resultado deseado, en este caso la captura de pantalla sólo muestra un fondo de escritorio vacío y una barra de menú. Estoy ejecutando MacOS 12.5 Monterey.
Mi objetivo es tomar capturas de pantalla automáticamente usando launchd para llamar a un shell script periódicamente. Específicamente quiero llamar a un shell script o archivo ejecutable unix, y no quiero utilizar cron o cualquier otra aplicación que no sea launchd para fines de programación. Mi captura de pantalla real shell script es más complicado que en el ejemplo. En el pasado he sido capaz de cargar con éxito otros demonios llamando a shell script como en el ejemplo a través de launchctl, pero nunca me había encontrado con problemas de permisos como este.
Ejemplo
screenshot.sh
#!/bin/zsh
# save as `~/Library/bin/screenshot.sh`
# make executable by ways of the following command: `chmod +x ~/Library/bin/screenshot.sh`
screencapture -C ~/Desktop/test$( date +'%H%M%S' ).png;
Guarde este script en ~/Library/bin/
y hacerlo ejecutable llamando a chmod +x
. Tenga en cuenta que llamar a ejecutar este script funciona bien si se ha dado a Terminal.app (o equivalente...) grabación de pantalla (véase "Permisos" más abajo).
com.example.screenshot.plist
<?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">
<!--
save as `~/Library/LaunchAgents/com.example.screenshot.plist`
load this by ways of the following command: `sudo launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.example.screenshot.plist`
unloading this: `sudo launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/com.example.screenshot.plist`
-->
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.example.screenshot</string>
<!-- replace <<USERNAME>> with the actual username -->
<key>Program</key>
<string>/Users/<<USERNAME>>/Library/bin/screenshot.sh</string>
<key>StartInterval</key>
<integer>10</integer>
<key>ProcessType</key>
<string>Background</string>
<key>StandardErrorPath</key>
<string>/tmp/launchd.example.screenshot_stderr.log</string>
<key>StandardOutPath</key>
<string>/tmp/launchd.example.screenshot_stdout.log</string>
</dict>
</plist>
En primer lugar, asegúrese de que en <key>Program</key>
<NOMBRE DE USUARIO> esté configurado con su nombre de usuario real, o que la ruta al archivo screenshot.sh sea absoluta. Guarde este .plist en ~/Library/LaunchAgents/
y carga llamando a sudo launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.example.screenshot.plist
. La descarga funciona cambiando el subcomando a arranque . La página de manual de launchctl se encuentra en aquí .
Permisos
Se pueden dar permisos de grabación de pantalla a las aplicaciones en Preferencias del Sistema Seguridad y Privacidad Privacidad Grabación de pantalla '+'. Añadiendo Terminal.app a esta lista, y reiniciando la aplicación se obtienen capturas de pantalla correctas cuando se llama a screenshot.sh directamente desde el terminal. He intentado añadir /bin/launchd, /bin/launchctl, /usr/sbin/screencapture, Terminal.app, y el screenshot script (guardado sin el sufijo .sh) a la lista de aplicaciones permitidas y luego reiniciar, pero todavía no soy capaz de producir capturas de pantalla adecuadas a través de launchd.
Pregunta resumida
Para la configuración anterior, ¿qué ajustes debo cambiar o qué permisos debo conceder para obtener capturas de pantalla adecuadas que muestren las aplicaciones abiertas?
Se han formulado preguntas relativas al mismo problema aquí y aquí pero las respuestas no son satisfactorias (no funcionan o no utilizan launchd).