কীভাবে প্যাকেজ ম্যানেজারকে অপেক্ষা করতে হবে যদি এপিটি-র অন্য একটি উদাহরণ চলছে?


50

আমি আপডেট সফটওয়্যার এবং সিনাপটিক প্যাকেজ ম্যানেজারের মতো অনেকগুলি সফ্টওয়্যার দেখেছি, তারা অপেক্ষা করছে যে অন্য কোনও প্রোগ্রাম ব্যবহার করছে /var/lib/dpkg/lockএবং লক হয়েছে কিনা। টার্মিনালের মাধ্যমে আমরা কীভাবে এটি করতে পারি? আমি apt-getম্যানুয়ালটি দেখেছি কিন্তু দরকারী কিছু পাই নি।


ভাল আপনি বেশ কয়েকটি এপ-গেট কমান্ড করতে পারেন। মত sudo apt-get install packagename && sudo apt-get updateএবং তারা একে অপরের পরে স্বয়ংক্রিয় ঘটবে।
আলভর

1
এই যে কি নেই: sudo apt-get install packagename1 packagename2 packagename3 ?
রিনজুইন্ড

( ইউনিক্স.স্ট্যাকেক্সেঞ্জারভিউ / সেকশনস / ৪৪6349 8৮৮/২ দেখুন ) আপনি যদি বিশেষ ক্ষেত্রে থাকেন যেখানে আপনি বুশ সময়ের জন্য অপেক্ষা করতে চাইছেন উবুন্টু ১৮.০৪ এবং তার উপরে শেষ করার জন্য)
আনন

উত্তর:


35

আপনি ব্যবহার করতে পারেন কমান্ড পরিবর্তে aptdaemon সাথে যোগাযোগ ব্যবহার করে প্যাকেজ ম্যানেজার কর্ম আপ সারিতে সরাসরি apt-get।aptdconম্যানপেজ আইকন

সুতরাং মূলত আপনি যা করতে পারেন sudo aptdcon --install chromium-browserবা যা কিছু করতে পারেন এবং সেই কমান্ডটি চলাকালীন আপনি আবার এটি চালাতে পারবেন তবে বিভিন্ন প্যাকেজ ইনস্টল করুন এবং এপটি-ডিমন কেবল ত্রুটিযুক্ত হওয়ার পরিবর্তে এগুলিকে সজ্জিত করবে।

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


4
aptdconএমনভাবে চালানো যেতে পারে যে এটি যেমন কোনও অনুরোধ গ্রহণ apt-get -yকরে?
নকি

4
yes | aptdcon --hide-terminal --install "package"হাইড টার্মিনাল প্রয়োজন, অন্যথায় পাইপিংয়ের yesফলে সমস্যার সৃষ্টি হবে।
হোয়াইটহ্যাট 101

1
এই উত্তরের সাথে সমস্যাটি হল এটির জন্য ইনস্টল করা প্রয়োজন aptdcon। আমি একটি বুটস্ট্র্যাপ স্ক্রিপ্টে কাজ করছি যা কোনও ভিপিএসের প্রাথমিক সেটআপ করে, যেখানে একটি পটভূমি প্রক্রিয়াটি কিছু প্রাথমিক সেটআপও করছে। আমি aptdconলকটির চারপাশে কাজ না করা অবধি ইনস্টল করতে পারি না ।
ভুয়া নাম

2
প্রাথমিক সার্ভার কনফিগারেশনের জন্য ফ্যাকনাম আপনি সম্ভবত ক্লাউড- ডিআইএন
জর্জি কাস্ত্রো

1
কোন প্যাকেজে aptdconআছে?
ctrl-alt-delor

45

আপনি করতে পারেন apt-getযদি অন্য সফ্টওয়্যার ম্যানেজার চলমান অপেক্ষা করতে জানতে। পরবর্তী স্ক্রিন কাস্ট থেকে আচরণের সাথে অনুরূপ কিছু:

এখানে চিত্র বর্ণনা লিখুন

আমি কিভাবে এটি তৈরি?

আমি নীচে নীচে বাশ কোড সহ ডিরেক্টরিতে একটি নতুন স্ক্রিপ্ট apt-get(র‌্যাপার ফর apt-get) তৈরি করি /usr/local/sbin:

#!/bin/bash

i=0
tput sc
while fuser /var/lib/dpkg/lock >/dev/null 2>&1 ; do
    case $(($i % 4)) in
        0 ) j="-" ;;
        1 ) j="\\" ;;
        2 ) j="|" ;;
        3 ) j="/" ;;
    esac
    tput rc
    echo -en "\r[$j] Waiting for other software managers to finish..." 
    sleep 0.5
    ((i=i+1))
done 

/usr/bin/apt-get "$@"

এটি সম্পাদনযোগ্য করতে ভুলবেন না:

sudo chmod +x /usr/local/sbin/apt-get

পরীক্ষা করার আগে, সবকিছু ঠিক আছে কিনা তা পরীক্ষা করে দেখুন। which apt-getকমান্ডের আউটপুট এখনই হওয়া উচিত /usr/local/sbin/apt-get। কারণটি হ'ল: ডিফল্টরূপে ডিরেক্টরিটি ব্যবহারকারী বা রুটে ডিরেক্টরির /usr/local/sbinআগে স্থাপন করা হয় ।/usr/binPATH


সত্যিই আমার প্রশ্নের সরাসরি হিট। ধন্যবাদ :)
rʒɑdʒɑ

2
আপনার স্ক্রিপ্টটি কীভাবে এ্যাপ-গেটের স্তুপীকৃত উদাহরণ পরিচালনা করে? লাইক, এটি শেষ হওয়ার আগে আমি আরও 5 টি এপ-গেট চালু করব?
ব্রায়াম

ব্রায়েম আন্তরিকভাবে, আমি জানি না; আমি ভাল পরীক্ষক নই। আপনি এটি পরীক্ষা করেছেন? যদি সমস্যা দেখা দেয় তবে স্ক্রিপ্টের নতুন উদাহরণ শুরু হয়ে গেলে টাইমস্ট্যাম্প সহ একটি নতুন লক তৈরি করে স্ক্রিপ্টটি উন্নত করা যায় (কেবল উদাহরণ - আরও অনেক উপায় রয়েছে)।
রাদু রেডানু

কি দারুন! বাকপটু. আমি এ পর্যন্ত ছুঁড়ে ফেলেছি এমন সমস্ত কিছু দিয়ে কবজির মতো কাজ করে! দুই থাম্বস আপ ... এটি কেবল প্যাকেজের অংশ হওয়া উচিত: ডি
এরিক

2
ঐটা নির্ভুল! আমি যখন নতুন সার্ভারে প্যাকেজ ইনস্টল করতে AWS ক্লাউডনিট ব্যবহার করি তখন আমার সমস্যা হয়েছিল, তবে উবুন্টু aptবুটে কিছু স্টাফ করে, তাই আমার dpkgকমান্ডটি ডিপিপিজি ডিবি লক হওয়ার কারণে ব্যর্থ হয়েছিল। আমি আমার ক্লাউডনিট ইউজারডাটাতে এই ওয়ান-লাইনারটি রেখেছি: while fuser /var/lib/dpkg/lock >/dev/null 2>&1; do sleep 1; done; dpkg -i package.debএবং এটি দুর্দান্ত কাজ করে।
ভোলাডাইমার স্মোটেসকো

20

স্পষ্টত ছাড়াও &&, আপনি খুঁজছেন হতে পারে aptdcon। এই সরঞ্জামটি এপ্টের অন্যান্য উদাহরণগুলি সনাক্ত করতে সক্ষম হয় এবং তাদের সমাপ্তির জন্য অপেক্ষা করে:

sudo aptdcon - নিরাপদ-আপগ্রেড
[/] 11% অন্যান্য সফ্টওয়্যার পরিচালকদের প্রাপ্যতার জন্য অপেক্ষা করা ছাড়ার জন্য অপেক্ষা করছে

(আমি অন্য কোথাও দক্ষতা চালাচ্ছি)

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

পরিচালিত অপারেশনগুলি হ'ল aptdcon:

  • --refresh, -c: এটি সমান apt-get update। এটি আপনার প্যাকেজ তালিকা আপডেট করে।
  • --install, --remove, --upgrade, --purge, --downgrade। তাদের প্রত্যেকে তাদের নাম অনুসারে কাজ করে। প্যাকেজ (গুলি) এর নাম বাধ্যতামূলক। -i, -r, -u, -p, ইহারা সকলেই ব্যতীত ডাউনগ্রেড, যিনি এক নেই সংক্ষিপ্ত অপশন আছে।
  • --safe-upgrade, 's / এবং ' s / এর --full-upgradeপ্রতিযোগী । এগুলির জন্য পরামিতিগুলির প্রয়োজন নেই।apt-getupgradedist-upgradeaptitudesafe-upgradefull-upgrade
  • আরও বেশ কয়েকটি অপারেশন রয়েছে, যা ম্যানুয়ালটিতে পাওয়া যাবে। তবে এগুলি আগ্রহী ব্যবহারকারীরা সবচেয়ে বেশি ব্যবহার করেন aptd। সেখানে বিকল্প কি ওভারল্যাপ হয় apt-key, apt-cache, dpkgনা।

apt-getনিজেই এই জাতীয় পদ্ধতিগুলি সমর্থন করে না (অ্যাপের অন্যান্য উদাহরণগুলির জন্য অপেক্ষা করতে), তাই aptdconজিইউআইয়ের প্যাকেজ পরিচালকদের পছন্দসই সমাধান: ইউএসসি aptdব্যাক-এন্ড হিসাবে ব্যবহার করে , সিনাপটিকের মতোই। অন্যান্য সমাধানটি হ'ল packagekitতবে এটি যে ফাংশনটির জন্য আপনি এখনও সন্ধান করছেন তা সমর্থন করে না (এখনও)।


1
aptdcon --install /path/to/pgk.debএর মতো কাজ করে dpkg -i, যদিও ম্যানুয়ালটিতে আমি স্পষ্টভাবে উল্লিখিত এটি খুঁজে পাচ্ছিলাম না।
হোয়াইটহ্যাট 101

আমি কি এটি কোনও প্যাকেজে ইনস্টল করার পরে স্ক্রিপ্টে ব্যবহার করতে পারি?
নেলসন টিক্সিরা

@ নেলসনটিক্সির আপনি কেন পিপিএস-ইনস্টল স্ক্রিপ্টে এটি ব্যবহার করবেন? পোস্ট-ইনস্টলটি কার্যকর করা থাকলে স্পষ্টতই অ্যাপটি চলছে।
ব্রিয়াম

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

@ নেলসন টিক্সির আবার, কেন এটি প্রয়োজন হবে? ইনস্টল করার পরে স্ক্রিপ্টগুলি কেবল তখনই চালিত হয় যখন কোনও প্যাকেজ ইনস্টলেশন থাকে। আমি আপনাকে পরিবর্তে একটি প্রশ্ন জিজ্ঞাসা করার এবং আপনার কেসের আরও বিশদ দিয়ে ব্যাখ্যা করার পরামর্শ দিচ্ছি ।
ব্রায়াম

18

খুব সহজ পদ্ধতির মধ্যে একটি স্ক্রিপ্ট হবে যা লকটি না খোলার জন্য অপেক্ষা করেছিল। আসুন এটি কল করুন waitforaptএবং এটি আটকে দিন /usr/local/bin:

#!/bin/sh

while sudo fuser /var/{lib/{dpkg,apt/lists},cache/apt/archives}/lock >/dev/null 2>&1; do
   sleep 1
done

তারপরেই দৌড়াও sudo waitforapt && sudo apt-get install whateversudoersএটি আপনাকে পাসওয়ার্ডের প্রয়োজন ছাড়াই চালানোর অনুমতি দেওয়ার জন্য ব্যতিক্রম যুক্ত করতে পারে ( apt-getএটির কোনও লাভ নেই) এর জন্য আপনার এটির প্রয়োজন হবে )।

দুর্ভাগ্যক্রমে এটি জিনিসগুলির সারি করে না। এপটির কিছু ক্রিয়াকলাপ ইন্টারেক্টিভ (প্রদত্ত যে আপনি কি এই সমস্ত প্যাকেজগুলি মুছে ফেলার বিষয়ে নিশ্চিত?!) প্রদত্ত, আমি এর আশেপাশে কোনও ভাল উপায় দেখতে পাচ্ছি না ...


সম্ভবত -yসমস্ত অপারেশন জন্য হ্যাঁ অনুমান?
ব্রায়াম

ধন্যবাদ. আমি মনে করি যদি আমি ওরফে সহায়তা ব্যবহার করি তবে আমি এটি আরও ভালভাবে ব্যবহার করতে পারি।
rʒɑdʒɑ

3
নিশ্চিত না -yযদিও কাম্য।
অলি

1
আমি মনে করি না যে আপনি গুটিয়ে sudo fuserরাখতে চান [[ $(...) ]]। ফাইলটি অ্যাক্সেস করার সময় এটি একটি শূন্য প্রস্থান কোড ফেরত দেয় যাতে পর্যাপ্ত পরিমাণ হওয়া উচিত।
কিরি

4
আমি নীচের সমাধানটি আরও সম্পূর্ণ হতে পেলাম, কারণ while sudo fuser /var/lib/dpkg/lock /var/lib/apt/lists/lock /var/cache/apt/archives/lock >/dev/null 2>&1; do echo 'Waiting for release of dpkg/apt locks'; sleep 5; done; sudo apt-get -yy update
অ্যাপটি

3

আপনি একটি পোলিং কৌশল ব্যবহার করতে পারেন:

$ time (while ps -opid= -C apt-get > /dev/null; do sleep 1; done); \
  apt-get -y install some-other-package

ব্যবহার করা আরও ভালinotify
ctrl-alt-delor

3

আমি একটি স্ক্রিপ্ট তৈরি করেছি যা এটি করে:

#!/bin/bash

# File path to watch
LOCK_FILE='/var/lib/dpkg/lock'

# tput escape codes
cr="$(tput cr)"
clr_end="$(tput el)"
up_line="$(tput cuu 1)"

CLEAN(){
    # Cleans the last two lines of terminal output,
    # returns the cursor to the start of the first line
    # and exits with the specified value if not False

    echo -n "$cr$clr_end"
    echo
    echo -n "$cr$clr_end$up_line"
    if [[ ! "$1" == "False" ]]; then
        exit $1
    fi
}

_get_cmdline(){
    # Takes the LOCKED variable, expected to be output from `lsof`,
    # then gets the PID and command line from `/proc/$pid/cmdline`.
    #
    # It sets `$open_program` to a user friendly string of the above.

    pid="${LOCKED#p}"
    pid=`echo $pid | sed 's/[\n\r ].*//'`
    cmdline=()
    while IFS= read -d '' -r arg; do
        cmdline+=("$arg")
    done < "/proc/${pid}/cmdline"
    open_program="$pid : ${cmdline[@]}"
}

# Default starting value
i=0

# Checks if the file is locked, writing output to $FUSER
while LOCKED="$(lsof -F p "$LOCK_FILE" 2>/dev/null)" ; do
    # This will be true if it isn't the first run
    if [[ "$i" != 0 ]]; then
        case $(($i % 4)) in
            0 ) s='-'
                i=4
                _get_cmdline # Re-checks the command line each 4th iteration
            ;;
            1 ) s=\\ ;;
            2 ) s='|' ;;
            3 ) s='/' ;;
        esac
    else
        # Traps to clean up the printed text and cursor position
        trap "CLEAN False; trap - SIGINT ; kill -SIGINT $$" SIGINT
        trap 'CLEAN $((128+15))' SIGTERM
        trap 'CLEAN $((128+1))' SIGHUP
        trap 'CLEAN $((128+3))' SIGQUIT

        # Default starting character
        s='-'

        _get_cmdline
        echo -n "$save_cur"
    fi
    # Prints the 2nd line first so the cursor is at the end of the 1st line (looks nicer)
    echo
    echo -n "$cr$clr_end$open_program"
    echo -n "$up_line$res_cur$cr$clr_end[$s] Waiting for other package managers to finish..."
    #echo -en "$cr$clr_end[$s] Waiting for other package managers to finish..."
    #echo -en "\n$cr$clr_end$open_program$cr$up_line"
    ((i++))
    sleep 0.025
done

CLEAN False

# This allows saving the script under a different name (e.g. `apt-wait`)
# and running it. It only imitates `apt-get` if it was launched as such
if [[ "${0##*/}" == 'apt-get' ]]; then
    exec /usr/bin/apt-get "$@"
    exit $?
fi

উপরের সংরক্ষণ করুন /usr/local/sbin/apt-getapt-getএরপরে অপেক্ষা করুন যদি অন্য কোনও দৃষ্টান্ত ইতিমধ্যে চালু রয়েছে।

বিকল্পভাবে, /usr/local/sbin/apt-waitউদাহরণস্বরূপ ব্যবহার হিসাবে এটি সংরক্ষণ করুন :

apt-wait && aptitude

যা aptitudeবর্তমান প্রক্রিয়াটি লক ধারণের পরে চলে যাবে after

উদাহরণ রান:

  1. প্রথমত, একটি apt-getকমান্ড চালিত হয়, উদাহরণস্বরূপ:

    $ sudo apt-get remove some_package
    
  2. তারপরে, অন্য টার্মিনালে, অন্য একটি কমান্ড চালিত হবে:

    $ sudo apt-get install some_other_package
    

    এটি প্রথম কমান্ডটি শেষ হয়ে অপেক্ষা করবে run অপেক্ষা করার সময় আউটপুট:

    [/] Waiting for other package managers to finish...
          28223 : /usr/bin/apt-get remove some_package
    

1
ব্যবহার করা আরও ভালinotify
ctrl-alt-delor

3

দুর্ভাগ্যক্রমে আপনি যখন lxc এর মতো বিভিন্ন অনিচ্ছাকৃত নেমস্পেস পাত্রে চলেছেন তখন ফুজার আপনার জন্য খুব বেশি কিছু করে না।

এছাড়াও, অ্যাপ্টকনটি ডিফল্টরূপে ইনস্টল করা হয় না (কমপক্ষে 18.04 এ) এবং আপনার কাজটি একটি সারিতে ব্যাকগ্রাউন্ড করে দেয় যাতে আপনি সিরিয়ালাইজেশন হারাবেন। এটি অনিবার্যযোগ্য নয়, তবে এর অর্থ এটিপডকন ইনস্টল করার সময় অ্যাপে ফ্লকের ত্রুটিগুলি এড়ানোর জন্য আপনার অটোমেশনের কিছু উপায় থাকা দরকার এবং অ্যাপটিডকন এর মাধ্যমে প্যাকেজ ইনস্টল করার পরে আপনার যা কিছু সিরিয়ালাইজ করতে হবে তার জন্য কিছু ধরণের ওয়েল লুপ থাকা দরকার you'll ইতিমধ্যে এর জন্য কোনও ধরণের পতাকা না থাকলে।

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

সুতরাং মোড়কের মডেলটি অনুসরণ করে এটিকে / usr / স্থানীয় / বিন / এপটি-গেট হিসাবে যুক্ত করুন এবং ভাগ করুন।

এপিটিতে সমান্তরালতার অনুমতি না দিয়ে আইও সীমাবদ্ধ করার সুবিধাও রয়েছে যার ফলে আপনি ডিস্কটি না মেরে মাঝরাতে সর্বত্র ক্রোন ট্রিগার আপডেট করতে পারেন।

#!/bin/bash
exec /usr/bin/flock -w 900 -F --verbose /var/cache/apt/archives/lock /usr/bin/apt-get $@  

অ্যাপট-গেটের জন্য খুব সুন্দর এবং সাধারণ বৈশিষ্ট্যটির অনুরোধটি হ'ল একটি ব্লকিং / ওয়েট লকটিতে স্যুইচ করার জন্য একটি দ্বিগুণ পতাকা।


অ্যাপ্ট fcntl ব্যবহার করে, না ঝাঁক, তাই এটি কাজ করবে না। জিজ্ঞাসাবাবু
অ্যান্ডি

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

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