কোনও সিমলিংক লুপ হয় কিনা তা সিদ্ধান্ত নেওয়ার জন্য কি অ্যালগরিদম আছে?


16

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

কিছু উদাহরণ:

a/b/c/d
where a/b is a symlink to ../e
and e is a symlink to f
and f is a symlink to a/b

a/b/c/d
where a/b/c is a symlink to ../c

a/b/c/d
where a/b/c is a symlink to ../c/d

a/b/c/d
where a/b/c is a symlink to /a/b/e
where a/b/e is a symlink to /a/b/f
where a/b/f is a symlink to /a/b/g

সম্পাদনা করুন :

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

/ -- a -- b
where b is a symlink to /a

এই ডিরেক্টরি ট্রিটিতে স্পষ্টভাবে একটি চক্র রয়েছে, তবে পথটি a/b/b/b/b/bএখনও সূক্ষ্মভাবে সমাধান করে /a


কমান্ড লাইন সরঞ্জাম readlink ...উপরের পরিস্থিতি সম্পর্কে কি বলে?
slm

1
আপনি কি জিজ্ঞাসা করছেন যে লুপগুলি থাকলে আমরা কেবল পথের নাম থেকে বলতে পারি? বা আমরা কোনও আদর্শ অপারেটিং সিস্টেমে এটি স্ট্যান্ডার্ড সরঞ্জামগুলি ব্যবহার করে এবং পথের নামগুলির বিভিন্ন উপাদানগুলির সমাধান করতে পারি তা যাচাই করতে পারি?
মাইক ডিহেন

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

উত্তর:


10

আপনি কী জিজ্ঞাসা করছেন তা আমি পুরোপুরি বুঝতে পারি না। যদি আমি আরও ভাল না জানতাম তবে আমি মনে করি আপনি কোনও ফাইলের সাথে ডিল করার সময় এটি সনাক্ত করার কোনও উপায় আছে কিনা তা জিজ্ঞাসা করছেন। আমি বিশ্বাস করি না এটি সম্ভব।

কেবলমাত্র আমি যে পদ্ধতিটি ধারণা করতে পারি তা হ'ল এমন একটি অনুসন্ধান করা যেখানে আপনি বিশেষত ডিরেক্টরি গাছের একটি নির্দিষ্ট শাখার মাধ্যমে সন্ধান শুরু করেন।

উদাহরণ

$ tree 
.
`-- a
    `-- b
        |-- c
        |   `-- d
        |       `-- e -> ../../../../a/b
        `-- e -> e

5 directories, 1 file

findকমান্ড এই লুপ নির্ণয় করতে পারবে কিন্তু না সত্যিই আপনি এটি সম্পর্কে একটি সম্পূর্ণ অনেক বলুন।

$ find -L . -mindepth 15
find: File system loop detected; `./a/b/c/d/e' is part of the same file system loop as `./a/b'.
find: `./a/b/e': Too many levels of symbolic links

আমি যথেচ্ছভাবে 15 টি স্তর বেছে নিয়েছি যাতে কোনও আউটপুট দ্বারা আটকানো রোধ করতে পারে find। আপনি -mindepthযদি ডিরেক্টরি ট্রি প্রদর্শিত হচ্ছে সে বিষয়ে যত্ন না রাখেন তবে আপনি সেই স্যুইচটি ( ) ফেলে দিতে পারেন । findকমান্ড এখনও লুপ এবং স্টপ সনাক্ত করে:

$ find -L . 
.
./a
./a/b
./a/b/c
./a/b/c/d
find: File system loop detected; `./a/b/c/d/e' is part of the same file system loop as `./a/b'.
find: `./a/b/e': Too many levels of symbolic links

ঘটনাক্রমে, আপনি যদি MAXSYMLINKSলিনাক্সে স্পষ্টত 40 এর ডিফল্ট (কার্নেলের নতুন 3.x সংস্করণ) ওভাররাইড করতে চান তবে আপনি এই U&L প্রশ্নোত্তর শিরোনাম দেখতে পারেন: আপনি কীভাবে MAXSYMLINKS বৃদ্ধি করবেন ?

সিমলিংকস কমান্ড ব্যবহার করে

এমন একটি সরঞ্জাম রয়েছে যা এফটিপি সাইট রক্ষণাবেক্ষণকারীরা ডাকে ব্যবহার করতে পারত symlinksযা প্রতীকী লিঙ্কগুলির কারণে সৃষ্ট লম্বা বা ঝুলন্ত গাছগুলির সাথে সমস্যাগুলি প্রকাশ করতে সহায়তা করবে।

কিছু ক্ষেত্রে symlinksটুলটি আপত্তিকর লিঙ্কগুলিও মুছতে ব্যবহৃত হতে পারে।

উদাহরণ

$ symlinks -srv a
lengthy:  /home/saml/tst/99159/a/b/c/d/e -> ../../../../a/b
dangling: /home/saml/tst/99159/a/b/e -> e

গ্লিবসি লাইব্রেরি

গ্লিবসি লাইব্রেরিটি এটিকে ঘিরে কিছু সি ফাংশন সরবরাহ করে বলে মনে হচ্ছে তবে আমি তাদের ভূমিকা বা আসলে কীভাবে সেগুলি ব্যবহার করব তা পুরোপুরি জানি না। সুতরাং আমি কেবল তাদের কাছে আপনাকে নির্দেশ করতে পারি।

ম্যান পেজ, man symlinkডাকা ফাংশনটির জন্য ফাংশন সংজ্ঞা দেখায় symlink()। বর্ণনাটি এরকম হয়:

syMLink () newpath নামে একটি প্রতীকী লিঙ্ক তৈরি করে যার মধ্যে স্ট্রিং ওল্ডপ্যাথ রয়েছে।

ত্রুটিগুলির মধ্যে একটিতে বলা হয়েছে যে এই ফাংশনটি ফিরে আসে:

ইলুপ অনেক নতুন প্রতীকী লিঙ্কগুলির নতুনপথটি সমাধান করার ক্ষেত্রে মুখোমুখি হয়েছিল।

আমি আপনাকে ম্যান পৃষ্ঠাতেও পরিচালনা করব, man path_resolutionযা ইউনিক্স কীভাবে ডিস্কের আইটেমগুলির জন্য পথ নির্ধারণ করে তা আলোচনা করে। বিশেষত এই অনুচ্ছেদ।

If  the component is found and is a symbolic link (symlink), we first 
resolve this symbolic link (with the current lookup directory as starting 
lookup directory).  Upon error, that error is returned.  If the result is 
not a directory, an ENOTDIR error is returned.  If the resolution of the 
symlink is successful and returns a directory, we set the current lookup
directory to that directory, and go to the next component.  Note that the 
resolution process here involves recursion.  In order  to  protect  the 
kernel against stack overflow, and also to protect against denial of 
service, there are limits on the maximum recursion depth, and on the maximum 
number of symbolic links followed.  An ELOOP error is returned  when  the
maximum is exceeded ("Too many levels of symbolic links").

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

@ সোমজান - এ-এর জন্য আমার আপডেট দেখুন that
slm

5

ঠিক আছে, আরও কিছু ভাবার পরে আমি মনে করি আমার একটি পরিষ্কার সমাধান আছে।

সমালোচনামূলক অন্তর্দৃষ্টিটি হ'ল যদি প্রতিটি লিঙ্ক যে কোনও পথের অংশ হয় কোনও কিছুর সমাধান করে তবে পুরো পথটি সমাধান হয়ে যায়। বা অন্য উপায়ে, যদি কোনও পথটি সমাধান না করে তবে অবশ্যই একটি নির্দিষ্ট সিমলিংক থাকতে হবে যার সমাধান করতে হবে না এমন ট্র্যাভার্সিংয়ের প্রয়োজন।

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

যদি অ্যালগরিদম বর্তমানে কোন সিমলিংকটি সমাধান করছে তা ট্র্যাক করে রাখে (বা পুনরাবৃত্ত লিঙ্কগুলির ক্ষেত্রে কোন সিমলিঙ্কগুলি), এটি সনাক্ত করতে পারে যে এটি কোনও লিঙ্কটিকে পুনরাবৃত্তভাবে পুনরায় সমাধান করার চেষ্টা করছে যা এটি এখনও সমাধানে ব্যস্ত।

অ্যালগরিদম:

initialize `location` to the current working directory
initialize `link_contents` to the path we want to resolve
initialize `active_symlinks` to the empty set

def resolve_symlink(location, link_contents, active_symlinks) :
    loop forever:
        next_location = location / [first element of link_contents]
        see if next_location is a symlink.
        if so:
            if next_location in active_symlinks: abort, we have a loop
            location = resolve_symlink(location, readlink(next_location), active_symlinks ∪ {next_location})
        else:
            location = next_location
        strip first element of link_contents
        if link_contents is empty: 
            return location

সম্পাদনা করুন :

আমার এটির একটি https://bitbucket.org/JanKanis/python-inotify/src/853ed903e870cbfa283e6ce7a5e41aeffe16d4e7/inotify/pathresolver.py?at=pathwatcher এ অজগরটিতে এর কার্যকরী বাস্তবায়ন রয়েছে ।


3

পাইথনের একটি নেটওয়ার্কেক্স.সিম্পল_সাইক্লস () নামে একটি ফাংশন রয়েছে যা এর জন্য ব্যবহার করা যেতে পারে। তবে হ্যাঁ এটি সিস্টেমে প্রতিটি ফাইল পড়তে হবে।

>>> import networkx as nx
>>> G = nx.DiGraph()
>>> G.add_edge('A', 'B')
>>> G.add_edge('B', 'C')
>>> G.add_edge('C', 'D')
>>> G.add_edge('C', 'A')
>>> nx.simple_cycles(G)
[['A', 'B', 'C', 'A']]

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

@Somejan: একটি ফাইল সিস্টেম নামস্থান হয় গ্রাফ, এবং একটি ফাইলের নাম একটি পাথ যে গ্রাফ উপর মনোনীত হয়।
নিনজালজ

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

3

একটি নিরিবিলি ব্যবস্থাতে (অর্থাত্‍ যখন কোনও পরিবর্তন হচ্ছে না), হ্যাঁ, একটি অ্যালগরিদম রয়েছে। প্রতীকী লিঙ্কগুলির একটি সীমাবদ্ধ সংখ্যা রয়েছে, সুতরাং এগুলি একটি সীমাবদ্ধ গ্রাফ গঠন করে এবং চক্রগুলি সনাক্ত করা একটি চূড়ান্ত প্রক্রিয়া।

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


এই পরিবর্তনগুলিকে 98-99% অবধি নিখুঁত করতে প্রশমিত করার উপায় রয়েছে। আপনি এটি ফাইলের সময় স্ট্যাম্পগুলিতে মনোযোগ দিতে পারেন এবং আমি লিঙ্কগুলি অনুসরণ করার প্রস্তাব দিচ্ছি না। যেহেতু এটি মূল থেকে পুনরাবৃত্ত হয় তাই এটি পরে প্রকৃত ডিরেক্টরিটি খুঁজে পেতে পারে।
ব্যাক 2 বেসিক

1
@ ব্যাক 2 বেসিক এই সংখ্যাগুলি সম্পূর্ণ অর্থহীন। এটি একটি কার্নেল ইন্টারফেস। যদি এটি সমস্ত সময় কাজ না করে তবে এটি কাজ করে না, পিরিয়ড।
গিলস 'তাই মন্দ হওয়া বন্ধ করুন'

2

বর্তমান লিনাক্স কার্নেলের উত্সগুলি দেখার চেয়ে আমি যতই কাছে বলতে পারি, সমস্ত কার্নেলটি কত লিঙ্ক অনুসরণ করেছে তার একটি গণনা রাখে এবং এটি কোনও সংখ্যার চেয়ে বড় হলে এটি ত্রুটিযুক্ত হয়। মন্তব্য এবং ফাংশনটির জন্য namei.c এ 1330 লাইনটি দেখুন nested_symlink()। ইলুপ ম্যাক্রো ( read(2)এই অবস্থার জন্য সিস্টেম কল থেকে ফিরে আসা ত্রুটি নম্বর ) সেই ফাইলের বেশ কয়েকটি স্থানে প্রদর্শিত হয়, সুতরাং এটি লিঙ্কগুলি গণনা করার মতো সহজ নাও হতে পারে, তবে এটি ঠিক কেমন দেখাচ্ছে তা নিশ্চিত।

সংযুক্ত তালিকার "ফ্লাইডের চক্র সনাক্তকরণ অ্যালগরিদম" বা নির্দেশিত গ্রাফগুলিতে "চক্র" সন্ধানের জন্য বেশ কয়েকটি অ্যালগরিদম রয়েছে । কোনও নির্দিষ্ট পথে প্রকৃত "লুপ" বা "চক্র" সনাক্ত করতে আপনাকে কোনটি করতে হবে তা আমার কাছে পরিষ্কার নয়। যাইহোক, অ্যালগরিদমগুলি চালাতে দীর্ঘ সময় নিতে পারে, সুতরাং আমি অনুমান করছি যে অনুসরণ করা প্রতীকী লিঙ্কগুলির সংখ্যা গণনা করলে আপনি আপনার লক্ষ্যের 90% পথ পেতে পারেন।


ব্যবহারিক ব্যবহারের জন্য, অনুসরণ করা লিঙ্কগুলির সংখ্যা গণনা করা ঠিক আছে, বিশেষত যেহেতু কার্নেলটি এটি করে, তাই আপনি যদি খুব সঠিকভাবে সমাধানের পথের মুখোমুখি হন তবে অনেকগুলি চিহ্ন রয়েছে, আপনি এখনও সেই পথটিকে ব্যবহারিক কোনও কিছুর জন্য ব্যবহার করতে পারবেন না ( যেমন এতে ম্যানুয়ালি
সিমলিংকগুলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.