यदि APT का एक और उदाहरण चल रहा है, तो पैकेज मैनेजर को प्रतीक्षा कैसे करें?


50

मैंने कई सॉफ्टवेयर्स देखे हैं जैसे कि अपडेट मैनेजर और सिनैप्टिक पैकेज मैनेजर, वे प्रतीक्षा करते हैं कि क्या कोई अन्य प्रोग्राम उपयोग कर रहा है /var/lib/dpkg/lockऔर लॉक है। हम इसे टर्मिनल के माध्यम से कैसे कर सकते हैं? मैंने apt-getमैनुअल देखा लेकिन कुछ उपयोगी नहीं पाया।


अच्छी तरह से आप कई उपयुक्त आदेश प्राप्त कर सकते हैं। जैसे sudo apt-get install packagename && sudo apt-get updateऔर वे एक दूसरे के बाद स्वचालित हो जाएंगे।
अलवर

1
क्या यह ऐसा नहीं करता है sudo apt-get install packagename1 packagename2 packagename3 :?
रिनविंड

(देखें unix.stackexchange.com/questions/463498/… यदि आप उस विशेष मामले में हैं जहां आप उबंटू 18.04 और ऊपर के खत्म होने के लिए बूट समय की प्रतीक्षा करने की कोशिश कर रहे हैं)
Anon

जवाबों:


35

आप सीधे apt-get का उपयोग करने के बजाय aptdaemon के साथ संचार करके संकुल प्रबंधक कार्यों को पंक्तिबद्ध करने के लिए aptdconकमांडमैनपेज आइकन का उपयोग कर सकते हैं ।

तो मूल रूप से आप बस sudo aptdcon --install chromium-browserया जो कुछ भी कर सकते हैं और उस कमांड को चला रहे हैं, उसे आप फिर से चला सकते हैं, लेकिन अलग-अलग पैकेज स्थापित कर सकते हैं और एपेट-डेमॉन सिर्फ उन्हें बाहर करने के बजाय उन्हें कतार में खड़ा करेंगे।

यह विशेष रूप से उपयोगी है यदि आप एक लंबे उन्नयन या कुछ कर रहे हैं और पैकेज स्थापित करना चाहते हैं या यदि आप एक साथ कुछ लिख रहे हैं और यह सुनिश्चित करना चाहते हैं कि चीजें स्थापित करना अधिक विश्वसनीय होगा।


4
aptdconचलाया जा सकता है कि यह किसी भी संकेत के रूप में स्वीकार apt-get -yकरता है?
नोकी

4
yes | aptdcon --hide-terminal --install "package"छिपाना टर्मिनल की जरूरत है, अन्यथा पाइपिंग yesमुद्दों का कारण होगा।
व्हाइटहाट १०

1
इस जवाब के साथ समस्या यह है कि इसे स्थापित करने की आवश्यकता है aptdcon। मैं एक बूटस्ट्रैप स्क्रिप्ट पर काम कर रहा हूं जो एक VPS के शुरुआती सेटअप को करता है, जहां एक पृष्ठभूमि प्रक्रिया कुछ प्रारंभिक सेटअप भी कर रही है। aptdconजब तक मैं लॉक के आसपास काम नहीं कर सकता, मैं स्थापित नहीं कर सकता।
नकली नाम

2
@ आरंभिक सर्वर कॉन्फ़िगरेशन के लिए आप जो भी संभवत: क्लाउड- इनिट
जॉर्ज कास्त्रो

1
किस पैकेज aptdconमें है?
ctrl-alt-delor-Sepor

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


यह वास्तव में मेरे सवाल का सीधा हिट है। धन्यवाद :)
r32dʒɑ

2
आपकी पटकथा कैसे उपयुक्त उदाहरणों के ढेर का प्रबंधन करती है? जैसे, इससे पहले कि मैं खत्म करूँ मैं 5 और लॉन्च करूँ?
Braiam

@Braiam ईमानदारी से, मुझे नहीं पता; मैं अच्छा परीक्षक नहीं हूं। क्या आपने इसका परीक्षण किया? यदि समस्याएं दिखाई देती हैं, तो स्क्रिप्ट का एक नया उदाहरण शुरू होने पर टाइमस्टैम्प के साथ एक नया लॉक बनाकर स्क्रिप्ट में सुधार किया जा सकता है (बस एक उदाहरण - कई अन्य तरीके भी हैं)।
राडू रियडेनु

वाह! वाक्पटु। मैंने अब तक जो कुछ भी फेंका है, उसके साथ एक आकर्षण की तरह काम करता है! दो अंगूठे ऊपर ... यह सिर्फ पैकेज का हिस्सा होना चाहिए: D
एरिक

2
यह बिल्कुल सही है! मुझे समस्या थी कि मैं एक नए सर्वर पर पैकेज स्थापित करने के लिए AWS क्लाउडिनिट का उपयोग करता हूं, लेकिन उबंटू aptबूट पर कुछ सामान करता है , इसलिए dpkgलॉक dpkg db के कारण मेरी कमांड विफल रही। मैंने इस एक-लाइनर को अपने क्लाउडिनिट उपयोगकर्ताडेटा में डाल दिया है: while fuser /var/lib/dpkg/lock >/dev/null 2>&1; do sleep 1; done; dpkg -i package.debऔर यह बहुत अच्छा काम करता है।
वलोडिमिर स्मोस्को

20

स्पष्ट के अलावा &&, आप के लिए देख रहे हो सकता है aptdcon। यह उपकरण उपयुक्त के अन्य उदाहरणों का पता लगाने और उन्हें समाप्त करने के लिए प्रतीक्षा करने में सक्षम है:

sudo aptdcon - सुरक्षित-अपग्रेड
[/] 11% अन्य सॉफ्टवेयर प्रबंधकों के लिए प्रतीक्षारत की प्रतीक्षा करना

(मैं कहीं और अभिवृत्ति चला रहा हूँ)

इस टूल का लाभ यह है कि आप आगे क्या कर रहे हैं, इसके बारे में चिंतित हुए बिना लगातार कई क्रियाओं को स्टॉक कर सकते हैं। aptdconअनअटेंडेड स्क्रिप्ट्स और GUI इंस्टॉलेशन के लिए आदर्श है, क्योंकि आप टूल को बैकग्राउंड में चलाने की अनुमति दे सकते हैं ताकि आपके फ्रंटेंड को ब्लॉक न किया जा सके।

इनके द्वारा समर्थित संचालन 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स्वयं ऐसे तरीकों का समर्थन नहीं करता है (उपयुक्त के अन्य उदाहरणों के लिए प्रतीक्षा करने के लिए), इसलिए aptdconGUI के पैकेज प्रबंधकों के लिए पसंदीदा समाधान है: यूएससी aptdबैक-एंड के रूप में उपयोग करता है , सिनाप्टिक के रूप में। अन्य समाधान है packagekit, लेकिन यह उस फ़ंक्शन का समर्थन नहीं करता है जिसे आप (अभी तक) खोज रहे हैं।


1
aptdcon --install /path/to/pgk.debवैसे काम करता है dpkg -i, हालांकि मैं मैनुअल में स्पष्ट रूप से उल्लेख नहीं कर पाया।
व्हाइटहाट १०

क्या मैं पैकेज में पोस्ट-इंस्टॉल स्क्रिप्ट में इसका उपयोग कर सकता हूं?
नेल्सन टेक्सीरा

@NelsonTeixeira आप ppst- स्थापित स्क्रिप्ट में इसका उपयोग क्यों करेंगे? यदि पोस्ट-इंस्टॉलेशन निष्पादित किया जा रहा है तो जाहिर है कि एप चल रहा है।
ब्रिअम

मैं कुछ विशेष पैकेजों को स्थापित करना चाहता हूं जो रिपॉजिटरी में नहीं हैं। क्या यह संभव है ? मैं उन्हें पैकेज में शामिल करूंगा और फिर स्थापना खत्म होने के बाद स्क्रिप्ट उन्हें स्थापित करेगी।
नेल्सन टेक्सेरा

@NelsonTeixeira फिर से, यह क्यों जरूरी होगा? पोस्ट-इंस्टॉलेशन स्क्रिप्ट केवल तब चलती है जब पैकेज इंस्टॉलेशन होता है। मेरा सुझाव है कि आप इसके बजाय एक प्रश्न पूछें और अपने मामले को अधिक विस्तार से बताएं।
ब्रिअम

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 whatever। आप sudoersबिना पासवर्ड की आवश्यकता के इसे चलाने की अनुमति देने के लिए अपवाद जोड़ सकते हैं (आपको इसकी आवश्यकता होगी apt-getताकि यह कोई बड़ा लाभ न हो)।

दुर्भाग्य से यह चीजों की कतार नहीं है। यह देखते हुए कि apt के कुछ संचालन संवादात्मक हैं ("क्या आप सुनिश्चित हैं कि आप उन सभी पैकेजों को हटाना चाहते हैं?"), मैं इस के आसपास एक अच्छा तरीका नहीं देख सकता ...


शायद -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
मैनुअल Kie 7ling

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-Sepor

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वर्तमान प्रक्रिया के बाद लॉक पकड़े हुए चलेगा ।

उदाहरण रन:

  1. सबसे पहले, एक apt-getकमांड चलाया जाता है, उदाहरण के लिए:

    $ sudo apt-get remove some_package
    
  2. फिर, दूसरे टर्मिनल में, एक और कमांड चलाया जाता है:

    $ sudo apt-get install some_other_package
    

    यह पहले कमांड के समाप्त होने का इंतजार करेगा, फिर चलाएगा। प्रतीक्षा करते समय आउटपुट:

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

1
बेहतर उपयोग करने के लिएinotify
ctrl-alt-delor-Sepor

3

दुर्भाग्य से फ्यूज़र आपके लिए बहुत कुछ नहीं करता है, जब आप अलग-अलग बिना नाम वाले कंटेनर जैसे कि lxc में चल रहे होते हैं।

इसके अलावा, aptdcon डिफ़ॉल्ट रूप से (कम से कम 18.04 पर) स्थापित नहीं होता है और अपने कार्य को एक कतार में पृष्ठभूमि में रखता है ताकि आप क्रमांकन खो दें। यह असाध्य नहीं है, लेकिन इसका मतलब यह है कि आपके ऑटोमेशन को aptdcon स्थापित करते समय उपयुक्त तरीके से झुंड की त्रुटियों से बचने के लिए कुछ उपाय करने की आवश्यकता होती है, और आपको aptdcon के माध्यम से पैकेजों को स्थापित करने के बाद किसी भी तरह की प्रतीक्षा करने की आवश्यकता होगी। जब तक कि उसके लिए पहले से ही किसी प्रकार का झंडा न हो।

क्या काम करता है झुंड यह एनएफएस आदि पर भी काम करना चाहिए क्योंकि यह उसी तरह से फाइल सिस्टम लॉकिंग का उपयोग करता है, जो केवल -w सेकंड पैरामीटर के साथ एक त्रुटि को फेंकने के बजाय आपके लॉक पर इंतजार करेगा।

तो आवरण मॉडल का अनुसरण करते हुए, इसे / usr / लोकल / बिन / में apt-get के रूप में जोड़ें और साझा करें।

इसके कारण IO को सीमित करने का भी लाभ है, ताकि आप बिना डिस्क पर धड़कन के हर जगह आधी रात को क्रॉन ट्रिगर अपडेट दे सकें।

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

Apt-get के लिए एक बहुत अच्छा और सरल फीचर अनुरोध एक अवरोधक / प्रतीक्षा लॉक पर स्विच करने के लिए -w झंडा होगा।


उपयुक्त fcntl का उपयोग करता है, झुंड नहीं, इसलिए यह काम नहीं करेगा। askubuntu.com/questions/1077215/…
एंडी

यह पूरी तरह से काम करता है और fuserकई उत्तरों में दिखाए गए उपयोग की तुलना में एक बेहतर विकल्प है क्योंकि fuserलॉक को देखने और लक्ष्य प्रक्रिया को फिर से लॉक को हथियाने के बीच दौड़ की स्थिति होने का खतरा है। साथ flockलॉक का अधिग्रहण किया है और उसके बाद लक्ष्य प्रक्रिया को पारित कर दिया है, तो यह इस बीच में ताला खोने के लिए समय नहीं छोड़ देता है।
jrudolph

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.