Esegui uno script prima dell'arresto [duplicato]

3

Voglio eseguire uno script ogni volta che spengo il computer. So che questo è forse un duplicato e leggo davvero molti thread simili, ma la risposta non funziona più o non vedo come funziona la risposta.

Ho già capito che Apple vuole che io usi launchd . La maggior parte delle altre soluzioni non funziona più comunque.

Quindi ho trovato questa risposta ma per quanto vedo launchd fa tutto quando viene avviato il sistema. Copierò il codice qui sotto

<?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>

e lo 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;

Sfortunatamente non esiste un tutorial per launchd che includa una spiegazione molto semplice. Quindi, ad esempio, gli argomenti delle parentesi chiave sono più che semplici stringhe che attivano qualcosa, ma non riesco a trovare un elenco di quali parole attivano l'azione.

Mi piacerebbe capire l'idea di base di launchd . Soprattutto quali sono i comandi per l'esecuzione di uno script all'avvio dei sistemi e alla chiusura dei sistemi.

    
posta Nathanael Skrepek 16.05.2017 - 11:49
fonte

2 risposte

0

Racconterò ciò che ho scoperto finora:

Come menzionato in questo esegui lo script prima dell'arresto puoi utilizzare una logouthook per raggiungere l'obiettivo. Tuttavia, Apple ha interrotto il supporto di rc.shutdown e forse farà lo stesso con logouthook . La mela alternativa sta offrendo launchd ma non sono riuscito a trovare un comando che mi consenta di eseguire uno script prima del logout.

launchd funziona bene come sostituto di loginhook o cronjobs . Tuttavia, esiste una soluzione alternativa che consente di utilizzarla al posto di logouthook . La soluzione è già pubblicata nella mia domanda. Voglio solo menzionare come funziona:

Infatti lo script verrà eseguito all'avvio del computer, ma il comando trap attende il segnale di spegnimento in modo che la funzione desiderata venga eseguita quando il segnale viene inviato.

    
risposta data 18.05.2017 - 11:05
fonte
0

Penso che mi avvicinerei in modo diverso a quello che stai facendo, ma poi di nuovo il mio suggerimento è un po 'una soluzione alternativa rispetto a quello che vuoi.

Il mio approccio sarebbe quello di impostare il tuo script in modo che attivi l'arresto come parte del suo codice. In altre parole, invece di fare in modo che Shutdown attivi lo script, fare in modo che lo script attivi l'arresto.

Il vantaggio di questo è che puoi usarlo come opzione di spegnimento abituale, se lo desideri, ma se hai bisogno di spegnerlo anche senza eseguire lo script, puoi farlo (ad es. se devi spegnere più volte per la risoluzione dei problemi) , o se un'installazione spegne automaticamente il tuo Mac, ecc.)

Se questa è un'opzione accettabile per te, il codice di Applescript che ti serve è il seguente:

tell application "Finder" to shut down

In altre parole, è effettivamente necessario aggiungere il codice sopra a qualunque sia il tuo script.

Una volta che lo script funziona come vuoi, creo quindi un servizio di automazione che lo esegue. Questo non è obbligatorio, ma significa che sarai in grado di eseguire il tuo script dal menu Applicazione di qualsiasi applicazione. Inoltre, puoi anche creare una scorciatoia da tastiera per attivarla.

Se una o entrambe queste opzioni ti interessano, procedi in basso.

1. Crea un servizio utilizzando Automator

  1. Avvia Automator (di solito si trova nella cartella Applicazioni)
  2. Vai a File > Nuovo
  3. Seleziona servizio e fai clic su Scegli
  4. Nella parte in alto a destra della finestra visualizzata, assicurati che "Nessun input" sia selezionato dall'elenco a discesa Servizio ricevuto
  5. Assicurati che l'elenco a discesa In mostri "Qualsiasi applicazione"
  6. Nella seconda colonna contenente l'elenco lungo, trova "Esegui AppleScript" e fai doppio clic su di esso
  7. Questo aggiungerà la finestra Esegui AppleScript sulla destra
  8. Ora, sostituisci (* Lo script va qui *) con lo script
  9. Salva il servizio utilizzando un nome significativo (ad esempio ShutMeDown).

Ora dovresti essere in grado di eseguire il servizio (e quindi il tuo script) da qualsiasi applicazione andando all'elenco dei servizi all'interno di qualsiasi menu dell'applicazione (es. Finder > Servizi, Safari > Servizi, TextEdit > Servizi, ecc.) E seleziona il servizio che hai appena creato.

Se desideri impostare anche una scorciatoia da tastiera per attivare le cose, procedi in basso.

2. Creazione di una scelta rapida da tastiera

  1. Vai a Preferenze di Sistema > Tastiera > Tasti di scelta rapida
  2. Seleziona servizi dalla barra laterale
  3. Trova il tuo servizio (sarà nella lista sul lato destro)
  4. Aggiungi un collegamento facendo doppio clic sul nome del servizio
  5. Ora vai su Preferenze di Sistema > Sicurezza e amp; Privacy > Privacy
  6. Seleziona Accessibilità nella barra laterale
  7. Fai clic sul segno + (potrebbe essere necessario sbloccare il lucchetto se è bloccato)
  8. Aggiungi Automator.
  9. Aggiungi Finder (per trovarlo dovrai navigare su /System/Library/CoreServices/Finder.app ).
  10. Esci dalle Preferenze di Sistema.

Ora dovresti essere in grado di utilizzare la scorciatoia da tastiera per eseguire il servizio (e quindi il tuo script).

NOTA: sono consapevole che per le alcune scorciatoie da tastiera degli utenti non sembrano funzionare anche se sono state assegnate a un servizio. Questo è un altro argomento, ma se ciò accade nel tuo caso, almeno puoi eseguire il servizio da qualsiasi applicazione che stai utilizzando.

Se decidi di dare questo approccio, sentiti libero di commentarmi se hai domande / problemi.

    
risposta data 16.05.2017 - 13:13
fonte

Leggi altre domande sui tag