Xargs দিয়ে চালিত ব্যর্থ কমান্ড পুনরায় চেষ্টা করা হচ্ছে


2

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

find ./path -mindepth 1 -maxdepth 1 -type d | xargs -r -t -n 1 -P 4 -I % until rsync -am %/ $host::%/; do echo "TRY AGAIN"; done ./rsync_retry.sh: line 21: syntax error near unexpected token `do'


আপনি যে পরীক্ষার শর্তটি পরীক্ষা করার চেষ্টা করছেন তা কী? আপনি প্রতিটি ফাইলটিতে লুপ অবধি চালানোর জন্য xargs চান? প্রথম লাইন হওয়া উচিত?
Xen2050

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

1
xargsএকটি ভয়ঙ্কর ভাঙ্গা প্রোগ্রাম। শুধু না বলুন. জিএনইউ parallelএকটি বৃহত উন্নতি। এর জন্য খুব জটিল যে কোনও কিছুর জন্য আপনার অবশ্যই আলাদা ভাষা ব্যবহার করা উচিত যা প্রকৃতপক্ষে সামঞ্জস্য সমর্থন করে। কীভাবে চুষতে হবে না তার জন্য UseFind দেখুন find
ormaaj

উত্তর:


0

শুরু না হওয়া পর্যন্ত কেবল কিছু স্টাফ কেটে পেস্ট করুন ...

until find ./path -mindepth 1 -maxdepth 1 -type d | xargs -r -t -n 1 -P 4 -I % rsync -am %/ $host::%/
do
    echo "TRY AGAIN"
done

এটি ঠিক না হওয়া অবধি ... | xargs ... চালায়।


ব্যর্থ হয় এমন একক ডিরেক্টরিতে কেবল আরএসসিএন চালানোর জন্য, কেবল একটি দিরের জন্য একটি আরএসএনসি প্রয়োজন, কোনও জার্গস নেই, এবং অনুসন্ধান এবং পরীক্ষা / লুপটি বিভক্ত করার চেষ্টা করুন (দির নামগুলিতে নতুন লাইন বা পাগল অক্ষর থাকলে ব্যর্থ হতে পারে):

for dir in $( find ./path -mindepth 1 -maxdepth 1 -type d )
do
    until rsync -am %/ $host::%/ $dir   # Or replace with whatever single dir rsync works best for you
    do
        echo "TRY AGAIN"
        sleep 2
     done
done

এই পরবর্তীটি সম্ভবত আপনি যে উত্তরটির জন্য অপেক্ষা করছেন তা হ'ল xargs একটি ফাংশনটিকে বহু বার কল করে এবং ফাংশনটি "ব্যর্থ হলে পুনরায় চেষ্টা করুন" অংশটি করে:

doitright(){
until rsync -am "$@"/ $host::"$@"/ "$@"
    do
        echo "TRY AGAIN"
        sleep 2
     done
}

export -f doitright

find ./path -mindepth 1 -maxdepth 1 -type d | xargs -r -t -n 1 -P 4 -I{} bash -c "doitright {}"

আমি চাই না যদিও এটি সব আবার চালানো হোক। আমি কেবল চাই যদি তারা সফল না হয় তবে আরএসসিএনটির পুনরাবৃত্তি ঘটুক। প্রক্রিয়াটি দুই ঘন্টা পর্যন্ত সময় নেয়, তাই পুরো জিনিসটি পুনরায় করা সত্যিই কোনও বিকল্প নয়।
minhaz1

xargs একটি কারণ আছে, এটি আমাকে সমান্তরালভাবে rs rsync এর পি সংখ্যা চালাতে সহায়তা করে। এটি সময়কে স্থানান্তর করতে বড় পার্থক্য করার কারণে এটি একটি অত্যন্ত গুরুত্বপূর্ণ দিক।
minhaz1

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

0

জিএনইউ সমান্তরাল দিয়ে আপনি যা করবেন:

find ./ -mindepth 1 -maxdepth 1 -type d | parallel --retries 3000  rsync -am {}/ $host::{}/
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.