Cara mendaftarkan agen dengan launchd

14

Saya tidak dapat menjadwalkan peluncuran berkala dengan launchctl/ launchddi OS X (Leopard). Pada dasarnya, saya tidak dapat menemukan daftar petunjuk langkah demi langkah di web dan pendekatan intuitif tidak berfungsi.

The sync.plistFile:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>Label</key>
        <string>net.madrat.utils.sync</string>
        <key>Program</key>
        <string>rsync</string>
        <key>ProgramArguments</key>
        <array>
            <string>-ar</string>
            <string>/path/to/folder/</string>
            <string>/path/to/backup/</string>
        </array>
        <key>StartInterval</key>
        <integer>7200</integer>
    </dict>
</plist>

Saya telah menempatkan skrip ini di dalam path ~/Library/LaunchAgents.

Selanjutnya, saya sudah mendaftarkan skrip menggunakan

launchctl load ~/Library/LaunchAgents/sync.plist

Akhirnya, untuk menguji apakah itu berhasil, saya memulai pekerjaan:

 launchctl start net.madrat.utils.sync

- Tidak ada yang terjadi. Menjalankan rsyncperintah di terminal secara manual menghasilkan hasil yang diharapkan.

Saya cukup yakin bahwa pekerjaan itu terdaftar dengan benar karena jika saya mencoba memulai pekerjaan yang tidak ada, saya mendapatkan pesan kesalahan (yang saya tidak dapatkan di perintah di atas).

Apa kesalahan yang telah aku perbuat?

Konrad Rudolph
sumber

Jawaban:

5

Lingon adalah alat GUI yang baik untuk mengelola launchd. Proyek ini tampaknya tidak didukung sekarang ... tetapi pasti masih berfungsi pada 10.5.x.

Tetapi untuk masalah spesifik Anda ... apakah Anda sudah mencoba

sudo launchctl list 

Ini akan memberi tahu Anda jika .plist diaktifkan dengan benar. Ini akan mengembalikan 1 jika daemon tidak lauching, dan '0' jika berhasil. Mungkin mencari itu.

Setiap kali saya melihat angka '1' biasanya karena saya menempatkan skrip di tempat yang salah, membuat kesalahan ketik atau salah mengatur izin.

Juga .... sering reboot .. Saya pernah melihat

launchctl start

tidak efektif di mana reboot itu ..

Juga, dalam melihat pertanyaan Anda lebih dekat .... mengapa tidak hanya memasukkan kode rsync ke dalam skrip bash ... dan memasukkannya ke dalam /usr/bin/..... Kemudian Anda bisa hanya chmod+xfile itu .... dan menyederhanakan .plist Anda memecat skrip itu kapan pun Anda suka ....

CaseyIT
sumber
Terima kasih, memasukkan perintah ke dalam file shell tambahan dan meluncurkan yang berhasil. Ini adalah solusi yang sangat tidak memuaskan ... mengapa tidak menjalankan perintah secara langsung bekerja? By the way, launchctl list memang menampilkan 1, tetapi hanya setelah saya mulai menggunakan agen secara manual launchctl start.
Konrad Rudolph
Saya tidak positif, tapi saya pikir file launchd .plist benar-benar hanya dimaksudkan untuk mendefinisikan kriteria 'launch-on-demand' untuk daemon ... Mungkin tidak yakin apa yang harus dilakukan dengan argumen yang Anda berikan di <key> ProgramArguments </key>.
CaseyIT
11

Jawaban panjang:

Sulit untuk bekerja dengan launchd tanpa memahami beberapa prinsip dasar. Jadi sepertinya Anda tidak akan menemukan instruksi langkah-demi-langkah, ia memiliki begitu banyak kemampuan. Langkah yang baik adalah menuju panduan memulai di ADC: http://developer.apple.com/macosx/launchd.html

Anda juga dapat membaca halaman manual untuk launchd, launchctldan sintaks file .plist launchd.plist,.

Ada kesalahpahaman yang sering terjadi di mana menempatkan agen atau deamon Anda, jadi izinkan saya mendorong beberapa info tentang hal itu di sini:

  • Jika pekerjaan Anda perlu dijalankan bahkan ketika tidak ada pengguna yang masuk, letakkan di / Library / LaunchDaemons.
  • Jika ini hanya berguna ketika pengguna login, letakkan di / Library / LaunchAgents, atau di direktori LaunchAgents pribadi pengguna tertentu (~ / Library / LaunchAgents).
  • Jangan letakkan pekerjaan Anda di / System / Library, yang disediakan untuk daemon yang disediakan sistem.
~/Library/LaunchAgents         Per-user agents provided by the user.
/Library/LaunchAgents          Per-user agents provided by the administrator.
/Library/LaunchDaemons         System wide daemons provided by the administrator.
/System/Library/LaunchAgents   Mac OS X Per-user agents.
/System/Library/LaunchDaemons  Mac OS X System wide daemons.

Jawaban singkat:

Nama file plist Anda mungkin salah, tidak dapat diuji sekarang, tetapi saya akan mengaturnya net.madrat.utils.sync.plist. Mungkin berguna juga untuk pertama kali unloaddeamon Anda sebelum memuatnya jika Anda mengedit file.

Arko
sumber
Terimakasih atas infonya. Namun: (1) Saya sudah membaca semua dokumen yang Anda tautkan di atas, dan beberapa lainnya. Tidak ada tempat yang mengatakan bagaimana meluncurkan agen. (Setidaknya, saya tidak menemukannya di mana pun.) Itu akan baik-baik saja, jika pendekatan intuitif saya berhasil. (2) Mengubah nama file juga tidak berfungsi. :-( (3) beberapa informasi sudah ketinggalan zaman. Misalnya, mereka menyarankan perintah launchd bashuntuk debugging - tetapi ini tidak berfungsi pada Leopard ( launchdtidak dapat diluncurkan secara langsung).
Konrad Rudolph
@Konrad Rudolph: Sama-sama: :) @Skylarking mendapat beberapa poin menarik: apakah Anda memeriksa premisasinya? Atau menggunakan perintah sudo? Saya juga kadang harus reboot agar launchctl berfungsi dengan benar.
Arko
3

Saya tidak dapat menemukan dokumentasi bahwa ini sebenarnya perilaku standar, tetapi tampaknya launchd membutuhkan path absolut dalam file plist. Jadi coba /usr/bin/rsyncsaja. Bekerja untukku!

Erik Schoster
sumber
0

coba ini, skrip saya berfungsi tanpa menggunakan bagian program, cukup args program ...

menggantikan

    <key>Program</key>
    <string>rsync</string>
    <key>ProgramArguments</key>
    <array>
        <string>-ar</string>
        <string>/path/to/folder/</string>
        <string>/path/to/backup/</string>
    </array>

dengan

    <key>OnDemand</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
        <string>rsync</string>
        <string>-ar</string>
        <string>/path/to/folder/</string>
        <string>/path/to/backup/</string>
    </array>
Becky
sumber
0

coba tambahkan kunci ini ke file plist Anda

    <key>KeepAlive</key>
    <true/>
    <key>RunAtLoad</key>
    <true/>
tangkas
sumber
0

Anda memiliki satu hal yang salah dalam file .plist Anda, dan satu hal yang cerdik (masing-masing poin ini telah disentuh dalam jawaban sebelumnya; Saya membawa mereka bersama di sini).

Anda sebaiknya menulis:

<key>ProgramArguments</key>
<array>
  <string>/usr/local/bin/rsync</string>
  <string>-ar</string>
  <string>/path/to/folder/</string>
  <string>/path/to/backup/</string>
</array>

Argumen pertama dalam ProgramArgumentsarray adalah program yang akan dieksekusi - Anda telah menghilangkan ini. Jika Programkunci dihilangkan, maka default ke argumen pertama dari ProgramArguments; mungkin bijaksana untuk menentukan ini hanya sekali.

Karena Anda menghilangkan argumen pertama ini, .plist Anda akan memanggil rsync (dengan disebutkan namanya Program), tetapi 'argumen pertama' rsync seharusnya /path/to/folder, dan bukan -ar(program yang sedang berjalan akan terlihat secara singkat dalam psoutput, sebelum keluar dengan kesalahan, tetapi dinamai -ar, yang merupakan isi dari argumen nol).

Anda tidak harus memasukkan jalan menuju rsync, tetapi dalam konteks semacam ini, mungkin lebih bijaksana untuk melakukannya, untuk menghindari keharusan bergantung pada pengaturan PATHyang tepat.

Dokumentasi untuk ini ada di launchd.plist(5). Perhatikan bahwa halaman manual menekankan bahwa nilai ProgramArgumentskunci diteruskan ke execvp(3). Ini adalah halaman execvpmanual yang menjelaskan tentang pencarian PATH.

Norman Gray
sumber