প্রশ্ন চলমান duplicate ক্রন কাজ প্রতিরোধ


আমি প্রতি মিনিটে চালানোর জন্য একটি ক্রন কাজ নির্ধারিত করেছি কিন্তু কখনও কখনও স্ক্রিপ্টটি শেষ হওয়ার এক মিনিটেরও বেশি সময় নেয় এবং আমি চাই না যে কাজগুলি একে অপরের উপর "স্ট্যাক আপ" শুরু করতে চায়। আমি অনুমান করছি এটি একটি সমঝোতা সমস্যা - অর্থাত স্ক্রিপ্ট কার্যকরকরণ পারস্পরিক একচেটিয়া হতে হবে।

সমস্যার সমাধান করার জন্য আমি স্ক্রিপ্টটিকে একটি নির্দিষ্ট ফাইলের অস্তিত্বের জন্য সন্ধান করেছি ("lockfile.txt") এবং বিদ্যমান থাকলে বা প্রস্থান touch এটা না হলে এটা। কিন্তু এটি একটি সুন্দর lousy semaphore হয়! আমি কি সম্পর্কে একটি ভাল অনুশীলন যে সম্পর্কে জানা উচিত? পরিবর্তে আমি একটি ডেমন লিখতে হবে?


81
2017-11-09 11:32


উত্স




উত্তর:


এই বৈশিষ্ট্যটি স্বয়ংক্রিয়ভাবে তৈরি করার কয়েকটি প্রোগ্রাম রয়েছে, বিরক্তিকর এবং সম্ভাব্য বাগগুলি এটিকে নিজের থেকে সরিয়ে ফেলুন এবং দৃশ্যগুলির পিছনে পালক ব্যবহার করে স্ট্যাল লক সমস্যা এড়াতেও (যা আপনি শুধুমাত্র স্পর্শ ব্যবহার করে ঝুঁকিপূর্ণ) । আমি ব্যবহার করেছি lockrun এবং lckdo অতীতে, কিন্তু এখন আছে flock(1) (ইউটিলিটি-লিনাক্সের নতুন সংস্করণে) যা দুর্দান্ত। এটি ব্যবহার করা সত্যিই সহজ:

* * * * * /usr/bin/flock -n /tmp/fcj.lockfile /usr/local/bin/frequent_cron_job

109
2017-11-09 11:57



lckdo moreutils থেকে সরানো যাচ্ছে, এখন যে পালক (1) ইউটিলিটি-লিনাক্সে হয়। এবং যে প্যাকেজটি মূলত লিনাক্স সিস্টেমে বাধ্যতামূলক, তাই আপনি তার উপস্থিতি উপর নির্ভর করতে সক্ষম হওয়া উচিত। ব্যবহারের জন্য, নীচের দিকে তাকান। - jldugger
হ্যাঁ, পালক এখন আমার পছন্দের বিকল্প। আমি মামলা আমার উত্তর আপডেট করব। - womble♦
যে কেউ মধ্যে পার্থক্য জানেন flock -n file command এবং flock -n file -c command ? - Nanne
@ ন্যান, আমাকে নিশ্চিত করতে কোডটি চেক করতে হবে, কিন্তু আমার শিক্ষিত অনুমানটি হল -c একটি শেলের মাধ্যমে নির্দিষ্ট কমান্ড চালায় (ম্যানপ্যাজ অনুসারে), যখন "বেয়ার" (অ--c) শুধু ফর্ম execগুলি কমান্ড দেওয়া। শেলের মাধ্যমে কিছু নির্বাণ করার ফলে আপনি শেল-এর মতো জিনিসগুলি করতে পারবেন (যেমনটি একাধিক কমান্ডের সাথে বিচ্ছিন্ন ; অথবা &&), তবে যদি আপনি অবিশ্বাস্য ইনপুট ব্যবহার করেন তবে শেল সম্প্রসারণ আক্রমণগুলিতেও আপনাকে খোলা হয়। - womble♦
এটি একটি যুক্তি ছিল (hypothetical) frequent_cron_job কমান্ড যে এটি দেখানোর চেষ্টা করা হয় প্রতি মিনিটে চালানো হয়। এটি কোনও কাজে যোগ না করেই আমি এটি সরিয়ে ফেলেছি, এবং বিভ্রান্তি সৃষ্টি করে ফেলেছি (আপনার, যদি অন্য কেউ বছরের পর বছর ধরে না থাকে)। - womble♦


শেল মধ্যে সবচেয়ে ভাল উপায় ব্যবহার করা হয় ঝাঁক (1)

(
  flock -x -w 5 99
  ## Do your stuff here
) 99>/path/to/my.lock

27
2017-11-09 11:45



আমি FD পুনঃনির্দেশ একটি চতুর ব্যবহার আপত্তিকর করতে পারবেন না। এটা শুধু খুব arcanely ভয়ঙ্কর। - womble♦
বাশ বা ZSH এ আমার জন্য পার্স না, মধ্যে স্থান নিষ্কাশন করতে হবে 99 এবং > সুতরাং এটাই 99> /... - Kyle Brandt♦
@ জেভিয়ার: এর অর্থ হচ্ছে এটি চতুর এবং আর্কাইনা নয়, শুধু এটি নথিভুক্ত, চতুর, এবং arcane। - womble♦
এই চলমান চলাকালীন আপনি পুনরায় চালু করলে কী হবে বা প্রক্রিয়াটি কোনভাবেই মারা যাবে? তাহলে কি চিরদিনের জন্য লক হবে? - Alex R
আমি বুঝি এই কাঠামোটি একটি একচেটিয়া লক তৈরি করে কিন্তু আমি কিভাবে এটি সম্পন্ন হয় তার যান্ত্রিকতা বুঝতে পারছি না। এ প্রশ্নের উত্তর কি 99 এর ফাংশন? এই যত্ন ব্যাখ্যা কেউ যত্ন? ধন্যবাদ! - Asciiom


আসলে, flock -n পরিবর্তে ব্যবহার করা যেতে পারে lckdo*, তাই আপনি কার্নেল ডেভেলপার থেকে কোড ব্যবহার করা হবে।

তৈরী হচ্ছে গর্ভের উদাহরণ, আপনি কিছু ভালো লিখবেন:

* * * * * flock -n /some/lockfile command_to_run_every_minute

বিটিডব্লিউ, কোডটি দেখছে, সব flock, lockrun, এবং lckdo ঠিক একই জিনিসটি করুন, তাই এটি কেবলমাত্র একটি ব্যাপার যা আপনার কাছে সবচেয়ে সহজেই উপলব্ধ।

* যেহেতু, লেখার সময় আমার খ্যাতি দেওয়া হয়েছে, আমি পূর্বের উত্তরগুলির উপর সম্পাদনা বা মন্তব্য করতে পারছি না, আমাকে একটি পৃথক উত্তর হিসেবে লিখতে হবে।


21
2017-11-19 22:43





আপনি একটি লক ফাইল ব্যবহার করতে পারেন। যখন স্ক্রিপ্টটি শুরু হয় এবং এটি শেষ হয়ে গেলে এটি মুছে ফেলার সময় এই ফাইলটি তৈরি করুন। স্ক্রিপ্টটি এটির প্রধান রুটিন চালানোর আগে, লক ফাইলটি বিদ্যমান কিনা তা যাচাই করা উচিত এবং সেই অনুযায়ী এগিয়ে চলতে হবে।

ইউনিক্স সিস্টেমগুলিতে লকফিলগুলি ইনসक्रिप्ट এবং অন্যান্য অনেক অ্যাপ্লিকেশন এবং ইউটিলিটি দ্বারা ব্যবহৃত হয়।


2
2017-11-09 11:36



এই হল কেবল উপায় আমি এটা বাস্তবায়িত বাস্তবায়ন করেছি করেছি। আমি ওএসএস প্রকল্পের জন্য আয়না হিসাবে রক্ষণাবেক্ষণের পরামর্শ অনুযায়ী ব্যবহার করি - warren


এটি এমন একটি চিহ্ন হতে পারে যে আপনি ভুল জিনিস করছেন। যদি আপনার কাজগুলি ঘনিষ্ঠভাবে এবং যে ঘন ঘন চালানো হয়, আপনি হয়তো এটি de-cronning এবং এটি একটি ডেমন-স্টাইল প্রোগ্রামটি বিবেচনা করা উচিত।


1
2017-11-09 11:45



আমি আন্তরিকভাবে এই সঙ্গে অসম্মতি। আপনার যদি এমন কিছু থাকে যেটি পর্যায়ক্রমে চালানোর প্রয়োজন হয়, এটি একটি ডেমন তৈরি করা একটি "বাদামের জন্য স্লাজহ্যামমার" সমাধান। দুর্ঘটনাগুলি প্রতিরোধ করার জন্য একটি লকফিল ব্যবহার করে আমি পুরোপুরি যুক্তিসঙ্গত সমাধান ব্যবহার করে কোনও সমস্যা তৈরি করি নি। - womble♦
@ ওম্বলে আমি একমত কিন্তু আমি sledgehammers সঙ্গে বাদাম smashing ভালো লেগেছে! :-) - wzzrd


যদি আপনি স্ক্রিপ্টটিকে পূর্ববর্তী রানটি সম্পন্ন করার জন্য অপেক্ষা করতে চান বা না চান তবে আপনি নির্দিষ্টভাবে উল্লেখ করেছেন। "আমি একে অপরের উপর" স্ট্যাক আপ "আমি কাজ শুরু করতে চাই না" দ্বারা, আমি অনুমান করছি আপনি অনুমান করছেন যে আপনি স্ক্রিপ্টটি ইতিমধ্যে চলমান থাকলে প্রস্থান করতে চান,

সুতরাং, যদি আপনি lckdo বা অনুরূপ উপর নির্ভর করতে চান না, আপনি এই কাজ করতে পারেন:


PIDFILE=/tmp/`basename $0`.pid

if [ -f $PIDFILE ]; then
  if ps -p `cat $PIDFILE` > /dev/null 2>&1; then
      echo "$0 already running!"
      exit
  fi
fi
echo $$ > $PIDFILE

trap 'rm -f "$PIDFILE" >/dev/null 2>&1' EXIT HUP KILL INT QUIT TERM

# do the work


1
2017-11-09 14:33



ধন্যবাদ আপনার উদাহরণ সহায়ক - আমি স্ক্রিপ্ট ইতিমধ্যে চলমান যদি প্রস্থান করতে চান। উল্লেখ করার জন্য ধন্যবাদ ickdo - এটা কৌতুক করতে বলে মনে হচ্ছে। - Tom


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


1
2018-02-17 15:59





আমি ব্যবহার করে সুপারিশ করবে রান এক কমান্ড - লক সঙ্গে ডিল করার চেয়ে অনেক সহজ। ডক্স থেকে:

রান এক একটি আচ্ছাদিত স্ক্রিপ্ট যা একটি আর্গুমেন্টের অনন্য সেট সহ কিছু কমান্ডের একাধিক অনন্য উদাহরণ চালায়। এটি ক্রোনিবসের সাথে প্রায়শই দরকারী, যখন আপনি একটি সময়ে অনুলিপি চালানোর চেয়ে বেশি নন।

রান এই এক এটি রান-একের মতই, এটি পিজিপিকে ব্যবহার করবে এবং ব্যবহারকারীর মালিকানাধীন যে কোনও চলমান প্রসেস খুঁজে বের করতে এবং হত্যা করতে পারবে এবং লক্ষ্য কমান্ড এবং আর্গুমেন্ট মিলেছে। মনে রাখবেন যে রান-এই-এক মেলিং প্রসেসগুলি মারার চেষ্টা করার সময় অবরুদ্ধ থাকবে, যতক্ষণ না সেটি মিলে যায় প্রক্রিয়া মৃত।

রান এক ক্রমাগত এটি ছাড়া রান রান এক ঠিক মত কাজ করে COMMAND ছাড়াই যে কোনো সময় COMMAND [ARGS] "শূন্য" (শূন্য বা অ শূন্য)।

রাখা এক চলা রান-এক ক্রমাগত জন্য একটি উপনাম।

রান এক পর্যন্ত-সাফল্য রান রান এক মত ক্রমাগত কাজ ছাড়া এটি COMMAND [ARGS] শ্বাসরোধ করে না যতক্ষণ না COMMAND সফলভাবে বের হয় (অর্থাত্, শূন্য প্রস্থান)।

রান এক পর্যন্ত-ব্যর্থতা রান রান এক মত ক্রমাগত কাজ ছাড়া এটি COMMAND [ARGS] শ্বাসরোধ করে না যতক্ষণ না COMMAND ব্যর্থতার সাথে বের হয় (অর্থাত্, অ-শূন্য প্রস্থান)।


1
2017-10-02 21:53





আমি জাভা বা শেল ক্রন হতে পারে অনুরূপ ক্রু অনুরূপ সমস্যা সমাধানের জন্য একটি জার তৈরি করেছেন। শুধু ডুপুলিকেটে ক্রন নামটি পাস করুন। ক্লোস সেশন ("ডেমো.জার") এটি বর্তমান ছাড়া এই ক্রোনের জন্য বিদ্যমান পিডটি অনুসন্ধান এবং হত্যা করবে। আমি এই উপাদান করতে পদ্ধতি প্রয়োগ করা হয়েছে। স্ট্রিং pronam = ম্যানেজমেন্ট Factory.getRuntimeMXBean ()। GetName ();                 স্ট্রিং পিডি = proname.split ("@") [0];                 System.out.println ("বর্তমান পিআইডি:" + পিআইডি);

            Process proc = Runtime.getRuntime().exec(new String[]{"bash","-c"," ps aux | grep "+cronname+" | awk '{print $2}' "});

            BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream()));
            String s = null;
            String killid="";

            while ((s = stdInput.readLine()) != null ) {                                        
                if(s.equals(pid)==false)
                {
                    killid=killid+s+" ";    
                }
            }

এবং তারপর আবার শেল কমান্ড সঙ্গে killid স্ট্রিং হত্যা


0
2017-12-28 08:36



আমি সত্যিই এই প্রশ্নের উত্তর মনে হয় না। - kasperd