Shell o Applescript per ritardare l'arresto?

1

Abbiamo una workstation che viene utilizzata sporadicamente e sto provando a configurare uno script che lo esegue durante lo spegnimento. Ho creato un LogoutHook in com.apple.loginwindow su uno script di bash a una riga, che attiva un oggetto Applescript che confronta le mie voci di registro per determinare se il backup deve essere eseguito. In caso affermativo, chiama il principale Apple Apples che attiva un processo di backup Chronosync.

Funziona tutto ... tranne che a malapena riesco a avviare il processo di backup prima che il Mac lo interrompa e si chiuda. Suppongo che vengano emessi SIGTERM e SIGKILL e tutti i processi si adeguino rapidamente.

Ho anche esaminato il modo "corretto" di farlo con launchd (dato che LogoutHooks è deprecato). Launchd in realtà non supporta i processi di pianificazione al momento dell'arresto: richiede l'avvio dello script all'accesso, in attesa / in attesa di intercettare un SIGTERM. Di nuovo, questo pone il problema che l'intero sistema si sta spegnendo in pochi secondi, dallo stack di rete al demone Chronosync.

La pagina man per il comando shutdown dice anche:

Upon shutdown, all running processes are sent a SIGTERM followed by a SIGKILL. The SIGKILL will follow the SIGTERM by an intentionally indeterminate period of time. Programs are expected to take only enough time to flush all dirty data and exit.

C'è un modo per ritardare lo spegnimento fino a quando i miei script non sono stati completati? Idealmente voglio lo stesso comportamento dell'aggiornamento software di Apple, che impiega tutto il tempo necessario per installare gli aggiornamenti al momento del logout, prima di consentire l'arresto della macchina.

    
posta Drew 11.10.2013 - 20:14
fonte

2 risposte

3

Perché non modificare semplicemente il comportamento degli utenti nel processo di spegnimento per renderlo molto più semplice (con il minimo sforzo per lo scripting / programmazione del gancio di arresto)?

  • Informa gli utenti di non utilizzare il processo di spegnimento standard (dal menu o tramite la scorciatoia da tastiera) e utilizza invece il tuo AppleScript di backup che viene trasformato in un'app chiamata qualcosa come SafeShutdown.app
  • All'interno dello script dell'app SafeShutdown , esegui il backup e terminalo con un

    tell application "Finder"
        shut down
    end tell
    

    o con questo (verrà richiesta la password)

    do shell script "sudo shutdown -h now" with administrator privileges
    

    o con un

    tell application "System Events"
        shut down
    end tell
    
risposta data 11.10.2013 - 22:35
fonte
3

Lo script esce dopo aver attivato il backup di Chronosync? Se lo fa, prova a bloccare lo script fino al termine del backup.

Ho appena provato la disconnessione dopo aver eseguito questi comandi:

sudo defaults write com.apple.loginwindow LogoutHook ~/.logouthook
echo $'#!/bin/bash\nwhile sleep 1; do say a; done' > ~/.logouthook
chmod +x ~/.logouthook

Lo script di hook di logout era ancora in esecuzione dopo circa un'ora, quindi non sembra esserci alcun limite di tempo dopo il quale i hook di logout sono forzati a terminare.

    
risposta data 12.10.2013 - 09:40
fonte

Leggi altre domande sui tag