কোন ইউনিক্স আদেশগুলি সেমফোর / লক হিসাবে ব্যবহার করা যেতে পারে?


34

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


আপনি কী করছেন যে সমান্তরাল কাজ প্রয়োজন? আপনি কীভাবে নির্ভরতাগুলি এমনভাবে প্রকাশ করতে পারবেন না যে একটি সমান্তরালকে নিয়ন্ত্রণ make(1)করতে দেয় ? (যেমন, আপনার make -j 9যদি 8 টি কোর থাকে)? এটি সূক্ষ্ম গ্রানুলারিটির সাথে ইন্টারলিভিং কাজের অতিরিক্ত সুবিধা পেয়েছে।
ভোনব্র্যান্ড

উত্তর:


30

যদি lockfileআপনার সিস্টেমে ইনস্টল না করা থাকে তবে mkdirএটি কাজ করবে: এটি একটি পারমাণবিক অপারেশন এবং ডিরেক্টরিটি ইতিমধ্যে উপস্থিত থাকলে (যদি না আপনি -pকমান্ড-লাইন স্যুইচটি যোগ না করেন) ব্যর্থ হয় add

create_lock_or_wait () {
  path="$1"
  wait_time="${2:-10}"
  while true; do
        if mkdir "${path}.lock.d"; then
           break;
        fi
        sleep $wait_time
  done
}

remove_lock () {
  path="$1"
  rmdir "${path}.lock.d"
}

26

flock(1)

#!/bin/bash

# Makes sure we exit if flock fails.
set -e

(
  # Wait for lock on /var/lock/.myscript.exclusivelock (fd 200) for 10 seconds
  flock -x -w 10 200

  # Do stuff

) 200>/var/lock/.myscript.exclusivelock

এটি নিশ্চিত করে যে "(" এবং ")" এর মধ্যে কোডটি একবারে কেবল একটি প্রক্রিয়া দ্বারা চালিত হয় এবং প্রক্রিয়াটি খুব বেশি সময় ধরে লকের জন্য অপেক্ষা করে না।


খুব ভাল, এটি সম্পর্কে জানতেন না। তবে এটি আপাতদৃষ্টিতে লিনাক্স-নির্দিষ্ট ...
রিকার্ডো মুরি

1
@Riccardo, ফ্রিবিএসডি একটি অনুরূপ কমান্ড রয়েছে: lockf(1)
অ্যালেক্স বি

lockf(1)যদিও এই উদাহরণে ব্যবহৃত পদ্ধতিতে কাজ করে না। এটি আর্গুমেন্ট হিসাবে কোনও ফাইল বর্ণনাকারী নম্বর নিতে পারে না।
চার্লি

11

lockfile (1) একজন ভাল প্রার্থী মত দেখাচ্ছে, যদিও হুঁশিয়ার এটাই অংশ procmail প্যাকেজ, যা আপনি আপনার মেশিনে এখনও ইনস্টল করা নাও হতে পারে। এটি একটি জনপ্রিয় পর্যাপ্ত প্যাকেজ যা এটি ইনস্টল না করা থাকলে এটি আপনার সিস্টেমে প্যাকেজ করা উচিত। আমি যে চারটি সিস্টেম পরীক্ষা করেছি তার মধ্যে তিনটিতে এটি রয়েছে এবং অন্যটিতে এটি উপলব্ধ।

এটি ব্যবহার করা সহজ:

#!/bin/sh
LOCKFILE=$HOME/.myscript/lock
mkdir -p `dirname $LOCKFILE`

echo Waiting for lock $LOCKFILE...
if lockfile -1 -r15 $LOCKFILE
then
    # Do protected stuff here
    echo Doing protected stuff...

    # Then, afterward, clean up so another instance of this script can run
    rm -f $LOCKFILE
else
    echo "Failed to acquire lock!  lockfile(1) returned $?"
    exit 1
fi

আমি যে বিকল্পগুলি দিয়েছি সেগুলি 15 সেকেন্ড পর্যন্ত সেকেন্ডে একবার চেষ্টা করে। যদি আপনি এটি চিরকাল অপেক্ষা করতে চান তবে "-r" পতাকাটি ফেলে দিন।


2
কেবল রেফারেন্সের জন্য - ম্যান পেজ: linux.die.net/man/1/ockfile । :)
জোনস

সচেতন হন (ম্যানপেজ অনুযায়ী), "একবার কোনও ফাইল লক হয়ে গেলে, প্রতি পাঁচ মিনিটে একবার লকটি স্পর্শ করতে হবে বা লকটি বাসি হিসাবে বিবেচনা করা হবে, এবং পরবর্তী লক প্রচেষ্টা সফল হবে" "
জে

6

mkdir()POSIX ফাইল সিস্টেমে সিস্টেম কলটি পারমাণবিক। সুতরাং, mkdirকমান্ডটি এমনভাবে ব্যবহার করা যাতে এতে mkdir()আপনার উদ্দেশ্য অর্জনের জন্য হ'ল একটি কল জড়িত । (আইওডাব্লু, ব্যবহার করবেন না mkdir -p) সংশ্লিষ্ট আনলক rmdirঅবশ্যই হয়।

ক্যাভেট এমপোটার: mkdir()নেটওয়ার্ক ফাইল সিস্টেমে পারমাণবিক নাও থাকতে পারে।


হয় rmdirতাই পারমাণবিক?
আলেকজ মাগুরা


1

আপনি যদি কেবল ইউনিক্সে চলছেন তবে ফিফোস ব্যবহার করুন। আপনি ফিফোতে কাজের রেকর্ড লিখতে পারেন এবং এই ফাইলটি থেকে প্রক্রিয়াগুলি পড়তে পারেন এবং আপনার পাঠকরা ফিফোগুলিতে অবরুদ্ধ হবে।

লক ফাইলগুলি ঠিক আছে তবে আপনি যা বর্ণনা করেন তার জন্য আমি ফিফোসের সাথে যাব


1
ফিফোস কীভাবে রেসের পরিস্থিতি রোধ করতে পারে বলে আপনি বিশদটি বলতে পারেন?
জি-ম্যান বলছেন 'মনিকাকে পুনঃস্থাপন করুন'

0

এখানে যেমন পোস্ট করা হয়েছে: " শেল স্ক্রিপ্টগুলিতে লকিং সঠিক? ", FLOM (ফ্রি লক ম্যানেজার) সরঞ্জাম ব্যবহার করে, কমান্ড এবং শেল স্ক্রিপ্টগুলি সিরিয়ালাইজিং চালানো তত সহজ হয়ে যায়

flom -- command_to_serialize

FLOM আপনাকে আরও নমনীয় ব্যবহারের কেসগুলি (বিতরণ লকিং, পাঠক / লেখক, সংখ্যার সংস্থানসমূহ ইত্যাদি) বাস্তবায়িত করার অনুমতি দেয় এখানে এখানে বর্ণিত হয়েছে: http://sourceforge.net/p/flom/wiki/FLOM%20by%20ex উদাহরণ/

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