Launchd ile bir ajan nasıl kaydedilir


14

OS X (Leopard) ile launchctl/ launchdüzerinde periyodik bir başlatma planlayamıyorum . Temel olarak, web üzerinde adım adım talimatlar listesi bulamıyorum ve sezgisel yaklaşım işe yaramıyor.

sync.plistdosya:

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

Bu senaryoyu yolun içine koydum ~/Library/LaunchAgents.

Sonra, ben ettik kayıtlı kullanarak alfabenin

launchctl load ~/Library/LaunchAgents/sync.plist

Sonunda, işe yaradığını test etmek için işe başladım :

 launchctl start net.madrat.utils.sync

- Hiçbir şey olmadı. rsyncKomutun terminalde manuel olarak yürütülmesi beklenen sonucu verir.

Oldukça emin değilim var olmayan bir işe başlamak için çalışırsanız, ben (bir hata mesajı almak çünkü işin doğru kayıtlı olduğunu değilim etmedi yukarıdaki komuta olsun).

Neyi yanlış yaptım?

Yanıtlar:


5

Lingon , launchd'ı yönetmek için iyi bir GUI aracıdır. Proje şu anda desteklenmiyor gibi görünüyor ... ama kesinlikle 10.5.x üzerinde çalışıyor.

Ama senin özel problemin için ... denedin mi

sudo launchctl list 

Bu, .plist'in doğru şekilde tetiklenip tetiklenmediğini size söyleyecektir. Daemon lauch değilse 1 ve başarılı olursa '0' döndürür. Belki de ara.

Ne zaman bir '1' görsem genelde betiği yanlış yere koyduğum, yazım hatası yaptığım veya izinleri yanlış ayarladığım için.

Ayrıca ... sık sık yeniden başlat .. gördüm

launchctl start

bir yeniden başlatmanın olduğu yerde etkili olmaz ..

Ayrıca, sorunuzu daha yakından bakarak .... neden sadece rsync kodunu bir bash betiği içine koymak değil ... ve sopa /usr/bin/..... Sonra sadece chmod+xbu dosya .... ve .plist basitleştirmek bu senaryoyu istediğiniz zaman kovmak için ....


Teşekkür, extra kabuk dosyasına komutu koyarak ve fırlatma o hile yaptı. Yine de bu çok tatmin edici bir çözüm değil… neden komutu doğrudan çağırmak işe yaramıyor? Bu arada, launchctl list yaptığı ekranı 1, ama sonra kullanıyorum elle ajan başladı launchctl start.
Konrad Rudolph

Olumlu değilim, ama bence launchd .plist dosyaları gerçekten sadece cinler için 'isteğe bağlı başlatma' ölçütlerini tanımlamak için tasarlandı ... Belki <key> 'de ilettiğiniz argümanlarla ne yapacağınızdan emin değildim ProgramArguments </ key>.
CaseyIT

11

Uzun cevap:

Bazı temel ilkeleri anlamadan fırlatma ile çalışmak zordur. Bu nedenle, herhangi bir adım adım talimat bulamazsınız, çok fazla yeteneği vardır. ADC'deki başlangıç ​​kılavuzuna doğru yol almak iyi bir adımdır: http://developer.apple.com/macosx/launchd.html

Ayrıca man sayfalarını okuyabilirsiniz launchd, launchctlve .plist dosyaları sözdizimi launchd.plist.

Temsilcinizi veya deamon'unuzu nereye koyacağınız konusunda sık sık yanlış anlaşılma var, bu yüzden bu konuda biraz bilgi vereyim:

  • Hiçbir kullanıcı oturum açmamış olsa bile işinizin çalışması gerekiyorsa / Library / LaunchDaemons dizinine koyun.
  • Yalnızca kullanıcılar oturum açtığında faydalıysa, / Library / LaunchAgents veya belirli kullanıcıların kişisel LaunchAgents dizinlerine (~ / Library / LaunchAgents) koyun.
  • İşinizi, sistem tarafından sağlanan artalan süreçleri için ayrılmış / System / Library'ye koymayın.
~/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.

Kısa cevap:

Plist dosyanızın adı yanlış olabilir, şu anda test edemiyorum ama bunu ayarlamış olurdum net.madrat.utils.sync.plist. Ayrıca unload, dosyayı düzenlediyseniz, yüklemeden önce deamon'unuzu kullanmak da yararlı olabilir .


Bilgi için teşekkürler. Ancak: (1) Yukarıda bağladığınız tüm belgeleri ve daha fazlasını zaten okudum. Hiçbir yerde bir ajanın nasıl başlatılacağını söylemiyor. (En azından ben hiçbir yerde bulamadık.) İşte olacağını cezası, eğer benim sezgisel yaklaşım çalışıyorlardı. (2) Dosya adının değiştirilmesi de çalışmaz. :-( (3) bazı bilgiler güncel değil Örneğin, launchd bashhata ayıklama komutunu önerirler - ancak bu Leopard'da çalışmaz ( launchddoğrudan başlatılamaz)
Konrad Rudolph

@Konrad Rudolph: Rica ederim: :) @Skylarking bazı ilginç noktalar kazanıyor: Dosyanın öncülüğünü kontrol ettin mi? Yoksa sudo komutunu mu kullandınız? Ayrıca, launchctl'in düzgün çalışması için bazen yeniden başlatmam gerekiyordu.
Arko

3

Bu aslında standart bir davranış olduğunu belgelerini bulamıyorum, ancak launchd plist dosyalarında mutlak yollar gerektirir gibi görünüyor. Bunun /usr/bin/rsyncyerine deneyin . Benim için çalışıyor!


0

bunu deneyin, komut dosyalarım program bölümünü kullanmadan çalışır, sadece program argümanları ...

değiştirmek

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

ile

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

0

bu anahtarları plist dosyanıza eklemeyi deneyin

    <key>KeepAlive</key>
    <true/>
    <key>RunAtLoad</key>
    <true/>

0

.Plist dosyanızda yanlış bir şey ve çok tehlikeli bir şey var (bu noktaların her birine önceki yanıtlarda değinildi; onları burada bir araya getiriyorum).

Yazman daha iyi olur:

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

Dizideki ilk argüman ProgramArgumentsyürütülecek programdır - bunu atlamış olursunuz. Eğer Programanahtar atlanırsa, o zaman ilk bağımsız değişken varsayılan ProgramArguments; bunu yalnızca bir kez belirtmek akıllıca olacaktır.

Bu ilk bağımsız değişkeni atladığınızdan, .plistiniz rsync'i (adlandırılmış olarak ) çağırmış olacaktırProgram , ancak rsync'in 'ilk bağımsız değişkeni' olurdu /path/to/folderve değil -ar(çalışan program psçıkmadan önce çıktıda çok kısa bir süre görünür olacaktı ancak -arsıfırıncı argümanın içeriği olan olarak adlandırılan bir hata ).

Sen yok olması yolunu kapsayacak şekilde rsync, ama bağlamından bu sıralamada, bu güvenmek zorunda kalmamak için, bunu yapmak için muhtemelen ihtiyatlı var PATHuygun şekilde ayarlanmıştır.

Bunun için belgeler launchd.plist(5). Bu manpage'in ProgramArgumentsanahtarın değerinin iletildiğini vurguladığını unutmayın execvp(3). Bu var execvpYOLU arama konusunda açıklıyor manpage.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.