প্রতি 10 সেকেন্ডের চেয়ে বেশি ঘন ঘন রান প্রোগ্রাম চালু করা যাবে?


8

আমার মতো কিছু পরিষেবা রয়েছে যা আমি ফাইলগুলি সংশোধন করার পরে অবিলম্বে চালাতে চাই।

<?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>test</string>
    <key>ProgramArguments</key>
    <array>     
        <string>say</string>
        <string>a</string>
    </array>
    <key>WatchPaths</key>
    <array>
        <string>/Users/username/Desktop/</string>
    </array>
</dict>
</plist>

এমনকি থ্রটলআইন্টারওয়াল 1 বা 0 তে সেট করা থাকলেও সেগুলি কেবলমাত্র প্রতি 10 সেকেন্ডে চালিত হয়।

9/9/12 4:57:05.457 PM com.apple.launchd.peruser.501[138]: (test) Throttling respawn: Will start in 7 seconds
9/9/12 4:57:09.541 PM com.apple.launchd.peruser.501[138]: (test) Throttling respawn: Will start in 3 seconds

man launchd.plist কেবলমাত্র বলে যে প্রোগ্রামগুলি প্রতি 10 সেকেন্ডের বেশি ডিফল্টরূপে চালিত হয় না, তবে থ্রটলআইন্টারওয়ালাকে নীচে সেট করা যায়নি বলে উল্লেখ করা হয়নি।

ThrottleInterval <integer>
This key lets one override the default throttling policy imposed on jobs by launchd.
The value is in seconds, and by default, jobs will not be spawned more than once
every 10 seconds.  The principle behind this is that jobs should linger around just
in case they are needed again in the near future. This not only reduces the latency
of responses, but it encourages developers to amortize the cost of program invoca-
tion.

আপনি প্রোগ্রাম বা স্ক্রিপ্টটি 10 ​​সেকেন্ডের জন্য চালিয়ে রাখতে এবং প্রতি সেকেন্ডে পরিবর্তনগুলি দেখতে পারেন:

#!/bin/bash

start=$(date +%s)
prev=

until (( $(date +%s) >= $start + 10 )); do
    new=$(stat -f %m ~/Desktop/)
    [[ $prev != $new ]] && say a
    prev=$new
    sleep 1
done

বা রুবিতে একই:

#!/usr/bin/env ruby

start = Time.now
prev = nil

until Time.now >= start + 10
  current = File.mtime("#{ENV['HOME']}/Desktop/")
  `say a` if current != prev
  prev = current
  sleep 1
end

তবে সময়সীমা বাইপাস করার বা হ্রাস করার কোনও উপায় আছে কি? এটি ফোল্ডার ক্রিয়াকলাপগুলিতেও প্রযোজ্য।

উত্তর:


9

বাইপাস বা সময়সীমা হ্রাস করার কোনও উপায় নেই।

লঞ্চড জবস তৈরির বিষয়ে অ্যাপলের ডকুমেন্টেশনে নিম্নলিখিতটি উল্লেখ করা হয়েছে:

গুরুত্বপূর্ণ যদি আপনার ডেমনটি চালু হওয়ার পরে খুব দ্রুত বন্ধ হয়ে যায় তবে লঞ্চটি ভাঙ্গতে পারে যে এটি ক্র্যাশ হয়েছে। এই আচরণ চালিয়ে যাওয়া ডেমোনগুলি সাময়িক বরখাস্ত করা হবে এবং ভবিষ্যতে অনুরোধগুলি এলে আবার চালু করা হবে না। এই আচরণটি এড়াতে, লঞ্চের পরে কমপক্ষে 10 সেকেন্ডের জন্য বন্ধ করবেন না।

আপনার প্রোগ্রাম বা স্ক্রিপ্টটির কমপক্ষে 10 সেকেন্ড চলতে হবে। গত দশ সেকেন্ডে ফাইল পরিবর্তনের তারিখগুলি পরীক্ষা করতে, দশ সেকেন্ডের জন্য ঘুমানো এবং পুনরাবৃত্তি করার জন্য একটি লুপ বাস্তবায়নের বিবেচনা করুন।

বিকল্পভাবে, আপনি kqueue বা FSEvents API গুলি ব্যবহার করে নির্দিষ্ট ফাইলগুলি দেখতে পারেন । এই স্ট্যাকওভারফ্লো প্রশ্নটি সহায়ক হতে পারে, ম্যাক ওএস এক্সে ফাইল-স্তরের ফাইল সিস্টেম পরিবর্তন বিজ্ঞপ্তি


2

আপনার স্ক্রিপ্টটি শেষ হয়ে যাওয়ার পরিবর্তে পরিবর্তিত ফাইলগুলির জন্য একটি লুপ চেকিংয়ে চালিয়ে যেতে পারে। পরিবর্তিত ফাইলগুলি যাচাই করার পরে এটি কয়েক সেকেন্ডের জন্য ঘুমান। যদি এটি পরিবর্তিত ফাইলগুলি খুঁজে পায় তবে স্ক্রিপ্টটি চালিয়ে যান। তা না হলে আবার ঘুমোও।

এরপরে আপনার স্ক্রিপ্টটি প্রতি x মিনিটের মধ্যে শুরু করে ফেলেছে ঠিক আগের দৌড়ে মারা যাওয়ার ক্ষেত্রে। আপনার স্ক্রিপ্টের শুরুতে কোড করুন যাতে অন্য কোনও দৃষ্টান্ত ইতিমধ্যে চালু রয়েছে কিনা এবং যদি তা থেকে থাকে তবে নিজেই প্রস্থান করুন।


পূর্ববর্তীটি এখনও চলমান থাকলে অন্য আর একটি সূচনা শুরু হবে বলে মনে হচ্ছে না।
ল্রি

একই চাকুরীর টিকিটের একাধিক উদাহরণ চালু করা হবে না।
গ্রাহাম মিলন

1

আপনার যদি প্রতি 10 সেকেন্ডের চেয়ে বেশি বার স্ক্রিপ্ট শুরু করার প্রয়োজন হয় তবে এটি "কাঁটাচামচ" (পড়া: মেমরি বরাদ্দকরণ, নতুন প্রক্রিয়া শুরু করা ইত্যাদি) ক্ষেত্রে ব্যয়বহুল হতে পারে।

সুতরাং, এক্ষেত্রে আপনার নিজের " ডেমন " লেখার পক্ষে সেরা (প্রোগ্রাম, পটভূমিতে কী চলবে)

আমি আপনাকে BASH হিসাবে "আরও সক্ষম" ভাষা ব্যবহার করার পরামর্শ দিচ্ছি (আমার প্রিয়টি "পার্ল", তবে রুবিও ঠিক আছে) কারণ একটি ভাল ডিমন সময়সীমা, অ্যালার্মগুলি পরিচালনা করে - এমন কি জিনিস যা খাঁটি বাশে প্রয়োগ করা খুব শক্ত। (অবশ্যই, ডিমন আপনার ব্যাশ স্ক্রিপ্টগুলিও চালাতে পারে - প্রয়োজন হলে)। বেসিকগুলি হ'ল:

  • অন্তহীন চলছে এবং কিছু ইভেন্টের জন্য অপেক্ষা করছে স্ক্রিপ্ট। ইভেন্টটি কিছু নেটওয়ার্ক ইনপুট, বা সাধারণ টাইমার বা জাতীয় কিছু হতে পারে। ইভেন্টটি আসার পরে (যেমন অপেক্ষার রাজ্যের সমাপ্তি) স্ক্রিপ্টটি আপনি যা চান তা করবে এবং চক্রটি পুনরাবৃত্তি করবে।

পার্ল ওয়ার্ল্ডে ইতিমধ্যে এমন মডিউল রয়েছে যা আপনার স্ক্রিপ্টটিকে "ডেমন" প্রক্রিয়া হিসাবে সুর দেয়, উদাহরণস্বরূপ প্রোক :: ডেমন । আমি রুবি নিয়ে অভিজ্ঞ নই, তবে এই নিবন্ধটি আপনাকে সহায়তা করতে পারে।

আপনি আপনার ডেমন প্রক্রিয়াটি সিস্টেম স্টার্টআপে লঞ্চের মাধ্যমে, বা লগ ইন করার সময় অটোমেটর অ্যাপ্লিকেশন থেকে বা ম্যানুয়ালি টার্মিনাল থেকে শুরু করতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.