launchd process usando l'aerender per uscire presto

2

Sto cercando di eseguire aerender (renderer della riga di comando di After Effects) tramite launchd per eseguire il rendering di un video su un intervallo di tempo. Il comando funziona bene in Terminal. In launchd - anche quando uso screen -d -m ... - esce sempre in anticipo. Ecco la mia configurazione.

Vai al basso per le cose che ho già provato.

plist per launchd :

<?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>com.home.VideoGenerator</string>
    <key>ProgramArguments</key>
    <array>
      <string>/Users/home/Developer/VideoGenerator/exec/render.sh</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
    <false/>
    <key>StartInterval</key>
    <integer>300</integer>
    <key>StandardErrorPath</key>
    <string>/var/log/com.home.VideoGenerator.err.log</string>
    <key>StandardOutPath</key>
    <string>/var/log/com.home.VideoGenerator.out.log</string>
</dict>
</plist>

render.sh script:

#!/bin/bash
/Applications/Adobe\ After\ Effects\ CC\ 2018/aerender -project /Users/home/Developer/VideoGenerator/resource/video.aep -comp ExportMe -output /Users/home/Developer/VideoGenerator/output/video.mov -OMtemplate Output

Output:

Ecco come appare l'output normale, quando eseguo ./render.sh dalla riga di comando:

aerender version 15.0.1x73
PROGRESS: Launching After Effects...
PROGRESS: ...After Effects successfully launched
PROGRESS: Adding specified comp to Render Queue
PROGRESS:  4/2/18 8:41:57 AM PDT: Starting composition ExportMe.
...

Questo è troncato. Emette anche le impostazioni di composizione e renderizza i progressi, sempre con successo. Niente di utile per questo scopo.

Ecco l'output registrato quando lo eseguo da launchd :

aerender version 15.0.1x73
PROGRESS: Launching After Effects...
PROGRESS: ...After Effects successfully launched

E questo è tutto. (In realtà sto eseguendo questo in un contesto in cui posso registrare il codice di uscita ed è sempre 0. A tale scopo ho semplificato drasticamente il progetto a ciò che vedi qui, e ancora non funziona).

Cose che ho provato:

  • Imposta KeepAlive su true nel plist
    • Questo riavvia semplicemente il processo dopo che è terminato
  • Aggiungi /dev/null come StandardInPath nel plist (come per post )
    • Ancora esce presto
  • Aggiungi -i e -c all'inizio di ProgramArguments (da stesso post di cui sopra )
    • Il comando non viene eseguito
  • Imposta AbandonProcessGroup su true nel plist
    • Ancora esce presto
  • Aggiungi & per mettere l'attività in background
    • Disattiva l'output
  • Avvia aerender con screen -d -m ...
    • Usando il flag -L e controllando il log, l'output è lo stesso; si ferma dopo che aerender avvia After Effects e quindi esce prima del rendering.

L'esecuzione di ps aux | grep aerender mostra oltre 20 processi in esecuzione (probabilmente da tutte le volte in cui ho eseguito lo script), la maggior parte di loro aerendercore . Ma nessun output, nessun video.

Che cosa sto sbagliando?

    
posta jperl 02.04.2018 - 20:56
fonte

2 risposte

2

(Montaggio / Aggiornato)

Secondo questo thread su StudioSysAdmins , il problema che sto incontrando è a causa di aerender si affida al Window Manager.

Aerender is a hack that wraps the entirely GUI based After Effects application with a basic command line render interface. The AE core itself still depends directly on the Window Manager. ...

- Robin Scher

Ho finito per aggirare questo problema usando AppleScript ( osascript ) nell'elenco delle proprietà in questo modo:

<?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>ProgramArguments</key>
    <array>
      <string>/usr/bin/osascript</string>
      <string>/absolute/path/to/run.applescript</string>
    </array>
    <key>KeepAlive</key>
    <false/>
</dict>
</plist>

Ecco come appare run.applescript :

tell app "/Applications/Utilities/Terminal.app"
  set w to do script "/Users/home/Developer/VideoGenerator/exec/render.sh; exit 0"
  repeat
    delay 1
    if busy of w is false then exit repeat
  end repeat
  #display dialog "finished"
end tell

Dico a launchd di usare osascript per eseguire aerender nel contesto di una finestra di Terminale. Un po 'contorto, ma funziona!

    
risposta data 02.04.2018 - 21:22
fonte
2

Come hai scoperto, aerender richiede l'accesso a Window Manager . Puoi provare a inserire il tuo lavoro in ~/Library/LaunchAgents che viene eseguito nella sessione utente o utilizzare un altro strumento di pianificazione.

launchd Alternative

Se un utente ha effettuato l'accesso o anche l'utente veloce è stato disattivato, è possibile utilizzare uno strumento come Power Manager per l'esecuzione il tuo gestore di finestre che richiede script e applicazioni.

HoscrittoPowerManager,quindisentitiliberodiporredomandetecniche.Losuggeriscoinquestocaso,perchéciòchedesiderièpossibilegrazieall'architetturadellostrumento.

perutenteeAccessogestorefinestre

PowerManageresegueunprocessoperutentechiamato pmuser . Questo processo ti consente di eseguire script e attività pianificate come utente specificato o come Utente attivo - l'utente più avanzato.

Nell'evento Power Manager, cerca il pop-up Ambiente . Controlla l'ambiente utente in cui verrà eseguito lo script della shell. Utente attivo è la sessione utente grafica più avanzata e ha accesso a Gestione finestre.

    
risposta data 02.04.2018 - 21:48
fonte

Leggi altre domande sui tag