पृष्ठभूमि प्रक्रियाओं और सेवाओं को शुरू किए बिना पैकेज स्थापित करें


43

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


मुझे आश्चर्य है कि इस तरह के कॉन्फ़िगरेशन का उपयोग करके कर्नेल या DKMS पैकेजों को स्थापित करते समय एक अस्थिर स्थिति में एक प्रणाली को छोड़ने की क्या क्षमता है। मैं इस क्षेत्र के बारे में ज्यादा नहीं जानता।
ændrük

@ ændrük कि मुझे चिंता हुई है। आप देखते हैं कि मैं एक ड्राइव पर न्यूनतम उबंटू स्थापित कर रहा हूं, फिर इसमें बूट करने के बजाय, मैं chrootउन पैकेजों को लाइव सीडी / यूएसबी का उपयोग करता हूं, जिनकी मुझे जरूरत है। बेशक, ड्राइवर, विशेष रूप से, जीपीयू ड्राइवर नहीं हैं और स्थापित करने की आवश्यकता है।
ऑक्सीविवि

जवाबों:


35

थोड़ा हैकिश है, लेकिन यह करने के लिए काफी विश्वसनीय तरीका है जो मैं एक स्वचालित स्थापना स्क्रिप्ट में थोड़ी देर के लिए उपयोग कर रहा हूं।

सबसे पहले एक निर्देशिका बनाएं, उदाहरण के लिए /root/fake, जिसमें सीमलिंक /bin/trueकहा जाता है:

initctl
invoke-rc.d
restart
start
stop
start-stop-daemon
service
deb-systemd-helper

आप उन्हें ऐसी स्क्रिप्ट स्क्रिप्ट भी बना सकते हैं जो कुछ भी नहीं करती हैं और सफलता लौटाती है।

फिर $PATHसंकुल को स्थापित करते समय उस निर्देशिका को शामिल करें :

PATH=/root/fake:$PATH apt-get install whatever

यह केवल डेमॉन को शुरू करने / फिर से शुरू करने से रोकता है, जबकि एक इनट्राम्राम्स बनाने जैसी चीजें अभी भी की जा रही हैं।

व्याख्या

स्क्रिप्ट जो पैकेज स्थापना और निष्कासन पर क्रियान्वित की जा रही हैं invoke-rc.dऔर सेवाओं को शुरू करने और बंद करने के लिए उल्लिखित आदेशों के निष्पादन या अन्य को हटाती हैं। हालांकि वे उन्हें पूर्ण पथ के साथ नहीं बुलाते हैं (कम से कम मैंने एक का सामना नहीं किया है)।

इसलिए शुरुआत में फेक "नो ऑपरेशन" कमांड डालकर $PATH, वास्तविक कमांड को कभी भी कॉल नहीं किया जाता है।

चूंकि केवल सेवाओं को शुरू / बंद करने के लिए उपयोग किए जाने वाले आदेशों को फेक किया जा रहा है, बाकी सब कुछ, विशेष रूप से महत्वपूर्ण कार्यों जैसे कि इनट्राम्राम्स-इमेज को अपडेट करने / बनाने में अभी भी काम करते हैं।


सिम्बलिंक्स से बिल्कुल परिचित नहीं, क्या आप अपने द्वारा उठाए गए सभी कदमों के साथ विस्तृत कर सकते हैं?
ऑक्सीविवि

एक सिमलिंक एक विशेष प्रकार की फ़ाइल है जिसमें कोई सामग्री नहीं है, इसके बजाय यह किसी अन्य फ़ाइल (पथ / नाम से) को संदर्भित करता है। उन्हें ln -sउदाहरण के लिए, इस मामले में बनाया जा सकता है ln -s /bin/true /root/fake/initctl
bseibold

यह डेमॉन को शुरू / पुनः आरंभ करने से कैसे रोकता है? @ के अनुसार psusi का जवाब invoke-rc.dजिम्मेदार है।
ऑक्सीविवि 7

$PATHचर की शुरुआत में निर्देशिका को फेक कमांड के साथ रखकर , सभी कॉल invoke-rc.dऔर अन्य जो कि डेमों को शुरू करने और रोकने के लिए उपयोग किए जा सकते हैं, नकली कमांड का उपयोग करते हैं। यही है, जब तक कि उन्हें एक पूर्ण मार्ग के साथ नहीं बुलाया जाता है, लेकिन मैंने कभी इसका सामना नहीं किया है।
14

आह, अब मैं देख रहा हूं कि यह कैसे काम करता है - मूल रूप से, सहजीवन मृत सिरों की ओर जाता है। लेकिन वास्तव में क्या /bin/trueचीज है? और पैकेजों में शामिल बाकी कमांड्स में से क्या? वे निर्दिष्ट द्वारा फेंक दिया ट्रैक नहीं मिलेगा $PATH?
14

27

पृष्ठभूमि डेमॉन के साथ शुरू किया जाता है invoke-rc.d, जो यह सुनिश्चित करता है कि डेमॉन शुरू नहीं हुआ है अगर इसकी आरसी स्क्रिप्ट कहती है कि यह वर्तमान सिस्टम रनलेवल में चलने वाला नहीं है। आप परिवेश चर RUNLEVEL सेट करके वर्तमान सिस्टम रनले के उसके विचार को ओवरराइड कर सकते हैं। रनवेवेल्स 0 और 6 में कुछ भी नहीं माना जाता है, लेकिन ऐसा प्रतीत होता है कि invoke-rc.dयह छोटी गाड़ी है और किसी भी तरह से चीजों को चलाता है यदि आप इन रनवे का उपयोग करते हैं। अधिकांश डेमों रनलेवल 1 में नहीं चलते हैं, इसलिए आप उन्हें इस तरह स्थापित होने से रोक सकते हैं:

sudo RUNLEVEL=1 apt-get install redis-server

मैं एक ड्राइव पर न्यूनतम उबंटू स्थापित कर रहा हूं, फिर इसमें बूट करने के बजाय, मुझे chrootउन पैकेजों को स्थापित करने के लिए एक लाइव सीडी / यूएसबी का उपयोग करना चाहिए जो मुझे चाहिए। चीजों के चलने के कारण, कभी-कभी मुझे उबंटू (लाइव सीडी) सत्र से बाहर कर दिया जाता है। वैसे भी, बात मैं पूछना चाहता हूँ, मैं कैसे इस का उपयोग करते हैं है RUNLEVELमें chroot?
ऑक्सीविवि

@Oxwivi, उसी तरह, लेकिन यह स्वचालित रूप से पता लगाने के लिए माना जाता है कि आप चेरोट में हैं और डेमॉन को छोड़ना शुरू करते हैं।
Psusi

क्या यह संभव है कि invoke-rc.dजिन मुद्दों का मैंने सामना किया, उसके लिए छोटी गाड़ी जिम्मेदार है?
ऑक्सविवि

@ ओक्सवीवी, यह संभव है, लेकिन अधिक संभावना है कि एक विशेष पैकेज छोटी गाड़ी है और उपयोग नहीं कर रहा है invoke-rc.d। यह कौन सा पैकेज था?
Psusi

मेरे पास कोई विचार नहीं है, मैंने बस सभी संकुल को स्थापित करने के लिए सूचीबद्ध किया है और आउटपुट को देखने के लिए टर्मिनल के आगे बुरा नहीं माना है।
16


5

मेरा मानना ​​है कि --no-triggersजब आप dpkgइंस्टॉल करते हैं तो आपको कमांड लाइन विकल्प का उपयोग करने की आवश्यकता होती है । कुछ इस तरह:

dpkg -i --no-triggers SomeBigPackage.deb

इस सेटिंग को लगातार बनाने के लिए ताकि apt-get installकोई ट्रिगर न चले, एक कस्टम dpkg कॉन्फ़िगरेशन फ़ाइल बनाएँ /etc/dpkg/dpkg.cfg.d/custom:

# Install packages without starting background processes and services
# See http://askubuntu.com/q/74061  
no-triggers

ध्यान दें कि dpkg अभी भी ट्रिगर्स को लॉग करता है क्योंकि वे नहीं चलते हैं:

$ sudo apt-get install redis-server 
…
Starting redis-server: redis-server.
$ service redis-server status
redis-server is not running

वैकल्पिक रूप से, serviceनई सेवा को बंद करने के लिए आपके पास इंस्टॉलर स्क्रिप्ट चलाने की कमांड हो सकती है:

service name_of_service stop

1
कोई apt-getसमकक्ष? या वहाँ एक तरीका है कि क्या सीधे का उपयोग करके या कुछ स्थापित करने के dpkgसाथ कॉन्फ़िगर करने के लिए है? --no-triggersdpkgapt-get
ऑक्सीविवि 7

dan_linder, मुझे आशा है कि आप @ Oxwivi के प्रश्न के उत्तर में मुझे संपादित करने में कोई आपत्ति नहीं करेंगे। यदि यह आपकी पसंद के अनुरूप नहीं है, तो इसे संशोधित / वापस करने के लिए स्वतंत्र महसूस करें।
ændrük

5
यह गलत है। ट्रिगर को डेमॉन शुरू करने से कोई लेना-देना नहीं है। ट्रिगर एक पैकेज है जो किसी अन्य के जवाब में खुद को फिर से कॉन्फ़िगर करने के लिए कुछ कार्रवाई कर रहा है, जैसे कि यदि आप एक पैकेज स्थापित करते हैं जो एक इनट्रामाफ़्स हुक जोड़ता है, तो यह आपके इनट्रैमफैट को फिर से बनाने के लिए इनट्रामाफ़्स-टूल्स पैकेज को ट्रिगर करता है।
Psusi

3

मैं क्या कर रहा है समाप्त हो रहा है क्या debootstrap संकुल स्थापित करते समय करता है, सिवाय इसके कि मैंने dpkg-divert का उपयोग किया है:

पहले वास्तविक फ़ाइलों को बाहर ले जाएँ:

dpkg-divert --add --rename --local /sbin/start-stop-daemon
dpkg-divert --add --rename --local /sbin/initctl

फिर डमी संस्करण बनाएं:

echo \
"#!/bin/sh
echo
echo \"Warning: Fake start-stop-daemon called, doing nothing\"" > "/sbin/start-stop-daemon"
chmod 755 "/sbin/start-stop-daemon"

echo \
"#!/bin/sh
echo
echo \"Warning: Fake initctl called, doing nothing\"" > "/sbin/initctl"
chmod 755 "/sbin/initctl"

फिर अपने उपयुक्त-अपग्रेड, इंस्टॉल्स इत्यादि प्राप्त करें, और फिर साथ में सफाई करें:

rm /sbin/initctl /sbin/start-stop-daemon
dpkg-divert --remove --rename /sbin/initctl
dpkg-divert --remove --rename /sbin/start-stop-daemon

मुझे पता है कि ऐसी अन्य कमांड्स हैं जिनका उपयोग सेवाओं को रोकने / शुरू करने के लिए किया जा सकता है, लेकिन डीबूटस्ट्रैप केवल परवाह करता है start-stop-daemonऔर initctlइसलिए, मैंने सूट का पालन किया।


3

एक त्वरित एक लाइनर:

echo -e '#!/bin/sh\nexit 101' | install -m 755 /dev/stdin /usr/sbin/policy-rc.d && apt-get install **Package** && rm -f /usr/sbin/policy-rc.d

"त्वरित वन-लाइनर" रखने वाले व्यक्ति के संबंध में, आप निष्पादन के रूप में /usr/sbin/policy-rc.d सेट करना भूल गए। इसे अन्यथा अनदेखा किया जाएगा।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.