लॉन्च के साथ एक एजेंट को कैसे पंजीकृत किया जाए


14

मैं OS X (तेंदुआ) के साथ launchctl/ समय-समय पर लॉन्च शेड्यूल करने में असमर्थ हूं launchd। मूल रूप से, मैं वेब पर निर्देशों की चरण-दर-चरण सूची खोजने में असमर्थ हूं और सहज दृष्टिकोण काम नहीं करता है।

sync.plistफ़ाइल:

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

मैंने इस स्क्रिप्ट को पथ के अंदर रखा है ~/Library/LaunchAgents

अगला, मैंने स्क्रिप्ट का उपयोग करके पंजीकरण किया है

launchctl load ~/Library/LaunchAgents/sync.plist

अंत में, यह परीक्षण करने के लिए कि यह काम करता है, मैंने काम शुरू किया:

 launchctl start net.madrat.utils.sync

- कुछ नहीं हुआ। rsyncटर्मिनल में कमांड को मैन्युअल रूप से निष्पादित करने से अपेक्षित परिणाम मिलता है।

मुझे पूरा यकीन है कि नौकरी सही ढंग से पंजीकृत हो गई थी क्योंकि अगर मैं गैर-मौजूदा नौकरी शुरू करने की कोशिश करता हूं, तो मुझे एक त्रुटि संदेश मिलता है (जो मुझे उपरोक्त आदेश में नहीं मिला था )।

मैंने गलत क्या किया?

जवाबों:


5

लॉन्च को प्रबंधित करने के लिए लिंगोन एक अच्छा GUI उपकरण है। परियोजना अब असमर्थित प्रतीत होती है ... लेकिन यह निश्चित रूप से अभी भी 10.5.x पर काम करती है।

लेकिन आपकी विशिष्ट समस्या के लिए ... क्या आपने कोशिश की है

sudo launchctl list 

यह आपको बताएगा कि .plist सही ढंग से फायरिंग कर रहा है या नहीं। यदि डेमॉन की प्रशंसा नहीं हो रही है, तो यह 1 वापस आ जाएगी और यदि यह सफल रहा तो '0'। शायद उसी की तलाश है।

जब भी मुझे '1' दिखाई देता है तो यह आमतौर पर होता है क्योंकि मैंने स्क्रिप्ट को गलत जगह पर रखा है, एक टाइपो बनाया है या गलत तरीके से अनुमतियाँ सेट की हैं।

इसके अलावा .... अक्सर रिबूट .. मैंने देखा है

launchctl start

प्रभावी नहीं जहां एक रिबूट था ..

इसके अलावा, अपने प्रश्न को करीब से देखने के लिए .... क्यों न सिर्फ उस rsync कोड को बैश स्क्रिप्ट में डाल दिया जाए ... और इसे इसमें चिपका दें /usr/bin/..... तो आप बस chmod+xउस फ़ाइल को देख सकते हैं .... और अपने .plist को सरल बना सकते हैं। जब भी आप चाहें उस स्क्रिप्ट को आग लगाने के लिए ...।


धन्यवाद, कमांड को एक अतिरिक्त शेल फ़ाइल में डालना और उस चाल को लॉन्च करना । यह एक बहुत ही असंतोषजनक समाधान है ... क्यों कमांड सीधे काम नहीं करता है? वैसे, launchctl list किया प्रदर्शन 1, लेकिन केवल तब मैं का उपयोग कर एजेंट मैन्युअल रूप से शुरू कर दिया launchctl start
कोनराड रूडोल्फ

मैं सकारात्मक नहीं हूं, लेकिन मुझे लगता है कि लॉन्चड .plist फाइलें वास्तव में डेमॉन के लिए 'लॉन्च-ऑन-डिमांड' मानदंड को परिभाषित करने के लिए बनाई गई हैं ... शायद यह सुनिश्चित नहीं था कि आप उन तर्कों के साथ क्या करना चाहते थे जो कि <key> में पारित हुए थे ProgramArguments </ कुंजी>।
केसीआईटी

11

लंबा जवाब:

कुछ बुनियादी सिद्धांतों को समझे बिना लॉन्च के साथ काम करना मुश्किल है। इसलिए यह संभव है कि आपको कोई चरण-दर-चरण निर्देश नहीं मिलेगा, इसमें इतनी क्षमताएं हैं। ADC पर आरंभ होने वाले मार्गदर्शक के लिए एक अच्छा कदम है: http://developer.apple.com/macosx/bunched.html

तुम भी के लिए आदमी पृष्ठों पढ़ सकते हैं launchd, launchctlऔर .plist फ़ाइलों वाक्य रचना launchd.plist

अपने एजेंट या बहरीन को कहां रखना है, इस बारे में लगातार गलतफहमी है, इसलिए मुझे इसके बारे में कुछ जानकारी यहां देनी चाहिए:

  • यदि कोई उपयोगकर्ता लॉग इन न होने पर भी आपकी नौकरी को चलाने की आवश्यकता है, तो इसे / Library / LaunchDaemons में डालें।
  • यदि यह केवल तभी उपयोगी होता है जब उपयोगकर्ता लॉग इन होते हैं, तो इसे / Library / LaunchAgents में, या विशिष्ट उपयोगकर्ताओं के व्यक्तिगत LaunchAgents निर्देशिकाओं में डालें (~ / Library / LaunchAgents)।
  • अपना काम / सिस्टम / लाइब्रेरी में न रखें, जो सिस्टम-प्रदत्त डेमॉन के लिए आरक्षित है।
~/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.

संक्षिप्त जवाब:

आपकी फ़ाइल का नाम गलत हो सकता है, अभी परीक्षण नहीं कर सकता है लेकिन मैंने इसे सेट कर दिया है net.madrat.utils.sync.plistunloadयदि आपने फ़ाइल को एडिट किया है, तो उसे लोड करने से पहले अपने डेमोन के लिए भी उपयोगी हो सकता है ।


जानकारी के लिए धन्यवाद। हालाँकि: (1) मैंने पहले ही आपके द्वारा जुड़े सभी दस्तावेजों को पढ़ा है, और कई और अधिक। कहीं यह वास्तव में नहीं कहता है कि एक एजेंट को कैसे लॉन्च किया जाए। (कम से कम, मुझे यह कहीं नहीं मिला।) यह ठीक होगा, अगर मेरा सहज दृष्टिकोण काम कर रहा था। (2) फ़ाइल का नाम बदलने से भी काम नहीं होता है। :-( (3) कुछ जानकारी पुरानी हैं। उदाहरण के लिए, वे launchd bashडिबगिंग के लिए कमांड का सुझाव देते हैं - लेकिन यह तेंदुए पर काम नहीं करता है ( launchdसीधे लॉन्च नहीं किया जा सकता है)।
कोनराड रूडोल्फ

@Konrad Rudolph: आपका स्वागत है: :) @Skylarking को कुछ दिलचस्प बिंदु मिलते हैं: क्या आपने फ़ाइल के प्रवेश की जाँच की? या sudo कमांड का इस्तेमाल किया? मुझे ठीक से काम करने के लिए लॉन्चक्टल के लिए भी कभी-कभी रिबूट करना पड़ा।
आर्को

3

मैं प्रलेखन नहीं पा सकता कि यह वास्तव में मानक व्यवहार है, लेकिन ऐसा लगता है कि लॉन्चड को प्लिस्ट फाइलों में पूर्ण पथ की आवश्यकता है। इसलिए /usr/bin/rsyncइसके बजाय प्रयास करें । मेरे लिये कार्य करता है!


0

यह कोशिश करो, मेरी स्क्रिप्ट कार्यक्रम भाग का उपयोग किए बिना काम करती है, बस कार्यक्रम args ...

बदलने के

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

इस कुंजी को अपनी फ़ाइल में जोड़ने का प्रयास करें

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

0

आपके पास .plist फ़ाइल में एक गलत चीज़ है, और एक डोडी चीज़ है (इनमें से प्रत्येक बिंदु को पहले के उत्तर में छुआ गया है; मैं उन्हें यहां एक साथ ला रहा हूं)।

आप बेहतर लेखन करेंगे:

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

ProgramArgumentsसरणी में पहला तर्क निष्पादित किया जाने वाला कार्यक्रम है - आप इसे छोड़ देंगे। यदि Programकुंजी छोड़ दी जाती है, तो यह पहले तर्क के लिए चूक जाती है ProgramArguments; यह केवल एक बार यह निर्दिष्ट करने के लिए बुद्धिमान है।

क्योंकि आपने इस पहले तर्क को छोड़ दिया है, आपके .plist ने rsync (नाम में ) के माध्यम से इनवॉइस किया होगाProgram , लेकिन rsync का 'पहला तर्क' होगा /path/to/folder, और आउटपुट से बाहर निकलने से पहले -ar(रनिंग प्रोग्राम बहुत ही संक्षिप्त रूप से psआउटपुट में दिखाई दिया होगा) एक त्रुटि, लेकिन नाम के रूप में -ar, जो शून्य तर्क की सामग्री है)।

आपको पथ को शामिल करने की आवश्यकता नहीं हैrsync , लेकिन इस तरह के संदर्भ में, संभवतः ऐसा करना समझदारी है, ताकि PATHउचित रूप से सेट होने पर भरोसा न किया जा सके।

इसके लिए प्रलेखन में है launchd.plist(5)। ध्यान दें कि उस मेनपेज में यह है कि ProgramArgumentsकुंजी का मान पास हो गया है execvp(3)। यह वह execvpपन्ना है जो PATH खोज के बारे में बताता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.