proses launchd menggunakan aerender keluar lebih awal

2

Saya mencoba lari aerender (Renderer baris perintah After Effects) via launchd untuk membuat video pada interval waktu. Perintah berfungsi dengan baik di Terminal. Di launchd - bahkan ketika saya gunakan screen -d -m ... - selalu keluar lebih awal. Ini pengaturan saya.

Lewati ke bawah untuk hal-hal yang sudah saya coba.

Plist untuk 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 naskah:

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

Keluaran:

Berikut adalah apa yang terlihat seperti output normal, ketika saya menjalankan ./render.sh dari baris perintah:

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

Ini terpotong. Ini juga menampilkan pengaturan komposisi dan membuat kemajuan, selalu berhasil. Tidak ada yang berguna untuk tujuan ini.

Inilah output yang dicatat ketika saya menjalankannya launchd:

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

Dan itu saja. (Pada kenyataannya saya menjalankan ini dalam konteks di mana saya dapat mencatat kode keluar dan selalu 0. Untuk tujuan ini saya secara drastis menyederhanakan proyek menjadi apa yang Anda lihat di sini, dan itu masih tidak berjalan).

Hal yang saya coba:

  • Set KeepAlive untuk true dalam daftar
    • Ini baru meluncurkan kembali proses setelah keluar
  • Menambahkan /dev/null sebagai StandardInPath dalam daftar (sesuai posting ini )
    • Masih keluar lebih awal
  • Menambahkan -i dan -c ke awal ProgramArguments (dari posting yang sama seperti di atas )
    • Perintah tidak berjalan
  • Set AbandonProcessGroup untuk true dalam daftar
    • Masih keluar lebih awal
  • Menambahkan & untuk menempatkan tugas di latar belakang
    • Output keheningan
  • Meluncurkan aerender dengan screen -d -m ...
    • Menggunakan flag -L dan memeriksa log, hasilnya sama; berhenti setelah aerender meluncurkan After Effects dan kemudian keluar sebelum rendering.

Lari ps aux | grep aerender menunjukkan lebih dari 20 proses yang berjalan (mungkin dari semua waktu saya menjalankan skrip), kebanyakan dari mereka aerendercore. Tapi tidak ada output, tidak ada video.

Apa yang saya lakukan salah?

jperl
sumber

Jawaban:

2

Seperti yang telah Anda temukan, aerender membutuhkan akses ke Window Manager . Anda bisa mencoba memasukkan pekerjaan Anda ~/Library/LaunchAgents yang berjalan di sesi pengguna, atau menggunakan alat penjadwalan lain.

launchd Alternatif

Jika pengguna masuk atau bahkan pengguna cepat dimatikan, Anda bisa menggunakan alat seperti Manajer Daya untuk menjalankan Window Manager Anda yang membutuhkan skrip dan aplikasi.

Power Manager on macOS

Saya menulis Power Manager, jadi silakan bertanya pertanyaan teknis. Saya menyarankannya dalam hal ini, karena apa yang Anda inginkan dimungkinkan berkat arsitektur alat ini.

per-pengguna dan Akses Window Manager

Power Manager menjalankan proses per pengguna yang disebut pmuser. Proses ini memungkinkan Anda untuk menjalankan skrip dan tugas terjadwal sebagai pengguna tertentu atau sebagai Pengguna Aktif - Pengguna terbanyak di depan.

Dalam acara Power Manager Anda, cari Lingkungan Hidup muncul. Ini mengontrol lingkungan pengguna tempat skrip shell Anda akan dijalankan. Pengguna Aktif adalah sesi pengguna paling grafis di depan dan memiliki akses ke Window Manager.

Power Manager scripting within the graphical user session

Graham Miln
sumber
1
Jawaban yang bagus, aplikasi yang sangat bagus! Inilah yang saya butuhkan. Saya akan menghubungi Anda lagi ketika sudah aktif dan berjalan :)
jperl
Dan FYI - Seharusnya saya menyebutkan saya memang menjalankannya sebagai LaunchAgent dan itu masih tidak berhasil. Terima kasih!
jperl
Jika Anda mengalami masalah atau butuh bantuan untuk membuat acara, jangan ragu untuk menghubungi kami melalui [email protected]
Graham Miln
1
Saya akhirnya mencari cara untuk menggunakan launchd. Saya perlu menjalankan skrip setiap 1 menit, di antara perubahan lain pada spec. Saya harap alat Anda membantu orang lain, dan terima kasih lagi untuk jawaban cepatnya!
jperl
2

(Diedit / Diperbarui)

Menurut utas ini di StudioSysAdmins , masalah yang saya temui adalah karena aerender Ketergantungan pada Window Manager.

Aerender adalah hack yang membungkus After Effects yang sepenuhnya berbasis GUI   aplikasi dengan antarmuka render baris perintah dasar. Inti AE   itu sendiri masih tergantung langsung pada Window Manager.   ...

- Robin Scher

Saya akhirnya menyelesaikan ini dengan menggunakan AppleScript ( osascript ) di daftar properti seperti:

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

Ini dia apa run.applescript seperti:

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

saya memberitahu launchd menggunakan osascript untuk berlari aerender dalam konteks jendela Terminal. Sedikit berbelit-belit, tetapi berhasil!

jperl
sumber