Ejecutar un script antes de apagar [duplicar]

3

Quiero ejecutar un script cada vez que apago mi computadora. Sé que esto es quizás un duplicado y realmente leo muchos hilos similares, pero la respuesta ya no funciona o no veo cómo funciona la respuesta.

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

Encontré esta respuesta pero por lo que veo, launchd hace todo cuando se inicia el sistema. 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 guión

#!/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;

Lamentablemente, no hay un tutorial para launchd que incluya una explicación muy básica. Así, por ejemplo, los argumentos de los corchetes clave son más que simples cadenas, activan algo, pero no puedo encontrar una lista de qué palabras activan qué acción.

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

    
pregunta Nathanael Skrepek 16.05.2017 - 11:49

2 respuestas

0

Te diré lo que he descubierto hasta ahora:

Como se menciona en este Ejecute el script antes de apagarlo puede usar un logouthook para lograr el objetivo. Sin embargo, Apple detuvo el soporte de rc.shutdown y quizás haga lo mismo con logouthook . La alternativa que ofrece Apple es launchd pero no pude encontrar un comando que me permita ejecutar un script justo antes de cerrar sesión.

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

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

    
respondido por el Nathanael Skrepek 18.05.2017 - 11:05
0

Creo que abordaría esto de manera diferente a lo que estás haciendo, pero nuevamente, mi sugerencia es un poco de una solución en comparación con lo que quieres.

Mi enfoque sería tener su secuencia de comandos configurada para que active el cierre como parte de su código. En otras palabras, en lugar de que el cierre active el script, haga que el script active el cierre.

La ventaja de esto es que puede usar esto como su opción de cierre habitual si así lo desea, pero si alguna vez necesita apagar sin ejecutar también su secuencia de comandos, puede hacerlo (por ejemplo, si tiene que cerrar varias veces para solucionar problemas). , o si una instalación apaga automáticamente su Mac, etc.).

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

tell application "Finder" to shut down

En otras palabras, efectivamente debe agregar el código anterior a lo que sea su script.

Una vez que la secuencia de comandos funcione como usted desea, crearé un Servicio Automator que lo ejecute. Esto no es obligatorio, pero significa que podrá ejecutar su script desde el menú de aplicaciones de cualquier . Y también significa que puede crear un método abreviado de teclado para activarlo.

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

1. Crea un servicio utilizando Automator

  1. Inicie Automator (que generalmente se encuentra dentro de su carpeta de Aplicaciones)
  2. Ir a Archivo > Nuevo
  3. Selecciona el servicio y haz clic en Elegir
  4. En la parte superior derecha de la ventana que aparece, asegúrese de seleccionar "Sin entrada" en la lista desplegable El servicio recibe
  5. Asegúrese de que la lista desplegable En muestre "Cualquier aplicación"
  6. En la segunda columna que contiene la lista larga, busque "Ejecutar AppleScript" y haga doble clic en ella
  7. Esto agregará la ventana Ejecutar AppleScript a la derecha
  8. Ahora, reemplaza el (* Tu script va aquí *) con tu script
  9. Guarde el servicio con un nombre significativo (por ejemplo, ShutMeDown).

Ahora debería poder ejecutar el servicio (y, por lo tanto, su secuencia de comandos) desde cualquier , accediendo a la lista de Servicios dentro de cualquier menú de la aplicación (por ejemplo, Finder > Services, Safari > Services, TextEdit > Servicios, etc.) y seleccione el servicio que acaba de crear.

Si también desea configurar un método abreviado de teclado para activar cosas, proceda a continuación.

2. Creando un atajo de teclado

  1. Ir a Preferencias del sistema > Teclado > Atajos
  2. Seleccione Servicios desde la barra lateral
  3. Encuentre su servicio (estará en la lista del lado derecho)
  4. Agregue un acceso directo haciendo doble clic en el nombre del servicio
  5. Ahora ve a Preferencias del sistema > Seguridad y amp; Privacidad > Privacidad
  6. Seleccione Accesibilidad en la barra lateral
  7. Haga clic en el signo + (es posible que deba desbloquear el candado si está bloqueado)
  8. Agregar Automator.
  9. Agregar buscador (para encontrar esto, tendrá que navegar hasta /System/Library/CoreServices/Finder.app ).
  10. Salga de sus Preferencias del Sistema.

Ahora debería poder usar el método abreviado de teclado para ejecutar el servicio (y, por lo tanto, su secuencia de comandos).

NOTA: soy consciente de que para algunos los atajos de teclado de los usuarios no parecen funcionar aunque se hayan asignado a un servicio. Este es otro tema, pero si esto sucede en su caso, al menos puede ejecutar el servicio desde cualquier aplicación que esté usando.

Si decide probar este enfoque, no dude en comentarme si tiene alguna pregunta o problema.

    
respondido por el Monomeeth 16.05.2017 - 13:13

Lea otras preguntas en las etiquetas