4 votos

Ejecuta un script antes del apagado

Quiero ejecutar un script cada vez que apague mi ordenador. Sé que esto es un duplicado y realmente leí muchos hilos similares, pero o bien la respuesta ya no funciona o no veo cómo funciona la respuesta.

Ya me di cuenta de que esa Apple quiere que use launchd . La mayoría de las otras soluciones ya no funcionan de todos modos.

Así que encontré esta respuesta pero por lo que veo launchd hace todo cuando el sistema se inicia. Copiaré el código de abajo

<?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>boot.shutdown.script.name</string>

<key>ProgramArguments</key>
<array>
  <string>SCRIPT_PATH/boot-shutdown.sh</string>
</array>

<key>RunAtLoad</key>
<true/>

<key>StandardOutPath</key>
<string>LOG_PATH/boot-shutdown.log</string>

<key>StandardErrorPath</key>
<string>LOG_PATH/boot-shutdown.err</string>

</dict>
</plist>

y el script

#!/bin/bash
function shutdown()
{

  # INSERT HERE THE COMMAND YOU WANT EXECUTE AT SHUTDOWN OR SERVICE UNLOAD

  exit 0
}

function startup()
{

  # INSERT HERE THE COMMAND YOU WANT EXECUTE AT STARTUP OR SERVICE LOAD

  tail -f /dev/null &
  wait $!
}

trap shutdown SIGTERM
trap shutdown SIGKILL

startup;

Desafortunadamente no hay un tutorial para launchd que incluyen una explicación muy básica. Por ejemplo, los argumentos de los corchetes son más que simples cuerdas que desencadenan algo, pero no puedo encontrar una lista de qué palabras desencadenan qué acción.

Me gustaría entender la idea básica de launchd . Especialmente cuáles son los comandos para ejecutar un script cuando los sistemas se inician y cuando los sistemas se apagan.

0voto

Monomeeth Puntos 139

Creo que me gustaría enfocar esto de manera diferente a lo que estás haciendo, pero de nuevo mi sugerencia es un poco más difícil en comparación con lo que quieres.

Mi enfoque sería tener tu script configurado de manera que desencadene el apagado como parte de su código. En otras palabras, en lugar de hacer que el apagado dispare el script, haz que el script desencadene el apagado.

La ventaja de esto es que puedes usarlo como tu opción habitual de apagado si quieres, pero si alguna vez necesitas apagarte sin ejecutar también tu script puedes hacerlo (por ejemplo, si tienes que apagarte varias veces para solucionar problemas, o si una instalación apaga automáticamente tu Mac, etc.).

Si esta es una opción aceptable para usted, entonces el código de Applescript que necesita es el siguiente:

tell application "Finder" to shut down

En otras palabras, es necesario añadir el código anterior a lo que sea tu script.

Una vez que tu script funcione como quieres, entonces crearía un Servicio Automático que lo ejecute. Esto no es obligatorio, pero significa que podrás ejecutar tu script desde el menú Aplicación de cualquier aplicación. Y, también significa que puedes crear un atajo de teclado para activarlo.

Si alguna o ambas opciones le interesan, proceda a continuación.

1. Crear un servicio usando Automator

  1. Lanzar Automator (normalmente se encuentra en su carpeta de aplicaciones)
  2. Ir a Archivo > Nuevo
  3. Seleccione Servicio y haga clic en Elegir
  4. En la parte superior derecha de la ventana que aparece, asegúrese de que "Sin entrada" esté seleccionado desde el El servicio recibe lista desplegable
  5. Asegúrate de que el En La lista desplegable muestra "Cualquier aplicación"
  6. En la segunda columna que contiene la lista larga, busca "Ejecutar AppleScript" y haz doble clic en ella
  7. Esto añadirá la ventana de Ejecutar AppleScript a la derecha
  8. Ahora, reemplazar el (* Tu script va aquí *) con tu script
  9. Guarda el servicio usando un nombre significativo (por ejemplo, ShutMeDown).

Ahora deberías poder ejecutar el servicio (y por lo tanto tu script) desde cualquier aplicación yendo a la lista de Servicios dentro de cualquier menú de Aplicación (por ejemplo, Finder > Servicios, Safari > Servicios, TextEdit > Servicios, etc.) y selecciona el servicio que acabas de crear.

Si también quieres establecer un atajo de teclado para activar cosas, procede a continuación.

2. Creando un atajo de teclado

  1. Vaya a Preferencias del Sistema > Teclado > Atajos
  2. Seleccione Servicios de la barra lateral
  3. Encuentra tu servicio (estará en la lista de la derecha)
  4. Añade un atajo haciendo doble clic en el nombre del servicio
  5. Ahora vaya a Preferencias del Sistema > Seguridad y Privacidad > Privacidad
  6. Seleccione Accesibilidad en la barra lateral
  7. Haz clic en el signo + (puede que tengas que desbloquear el candado si está cerrado)
  8. Añade Automator.
  9. Añade el Buscador (para encontrar esto tendrás que navegar hasta /Sistema/Biblioteca/Servicios básicos/Finder.app ).
  10. Salga de sus Preferencias del Sistema.

Ahora deberías poder usar el atajo de teclado para ejecutar el servicio (y por lo tanto tu script).

NOTA: Soy consciente de que para algunos los atajos de teclado de los usuarios no parecen funcionar aunque hayan sido asignados a un servicio. Este es un tema completamente distinto, pero si esto sucede en tu caso, al menos puedes ejecutar el servicio desde cualquier aplicación que estés usando.

Si decide probar este enfoque, siéntase libre de comentarme si tiene alguna pregunta/problema.

0voto

Nathanael Skrepek Puntos 111

Le diré lo que he averiguado hasta ahora:

Como se menciona en este Corre script antes de apagarse puedes usar un logouthook para lograr el objetivo. Sin embargo, Apple detuvo el apoyo de rc.shutdown y tal vez haga lo mismo con logouthook . La alternativa que ofrece la Apple es launchd pero no pude encontrar un comando que me permitiera ejecutar un script justo antes de cerrar la sesión.

launchd funciona bien como sustituto de un loginhook o cronjobs . Sin embargo, hay una solución para que puedas usarla en lugar de un logouthook . La solución ya está publicada en mi pregunta. Sólo quiero mencionar cómo funciona:

De hecho, el script se ejecutará cuando la computadora se inicie, pero el trap espera la señal de apagado para que se ejecute la función deseada cuando se envíe la señal.

0 votos

SIGKILL no es atrapable. El script es defectuoso.

0 votos

Todavía funciona. ok esto significa que puedo borrar esta línea :)

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X