मुझे सवाल का ठीक-ठीक उच्चारण करना कठिन लगता है लेकिन मैं अपना सर्वश्रेष्ठ दूंगा। मैं dwmअपने डिफ़ॉल्ट विंडो मैनेजर के रूप में उपयोग करता हूं औरdmenuमेरे अनुप्रयोग लांचर के रूप में। मैं शायद ही अपने ब्राउज़र से अलग जीयूआई अनुप्रयोगों का उपयोग करें। मेरा ज्यादातर काम सीधे कमांड लाइन से होता है। इसके अलावा, मैं ऑपरेटिंग सिस्टम, एप्लिकेशन आदि के बारे में अतिसूक्ष्मवाद का बहुत बड़ा प्रशंसक हूं। जिन उपकरणों से मुझे छुटकारा नहीं मिला उनमें से एक एप्लिकेशन लॉन्चर था। मुख्य रूप से इसलिए कि मुझे इस बात की सटीक समझ नहीं है कि एप्लिकेशन लांचर कैसे काम करते हैं / वे क्या करते हैं। यहां तक कि व्यापक इंटरनेट खोज केवल अस्पष्ट स्पष्टीकरण दिखाती है। जो मैं करना चाहता हूं वह मेरे एप्लिकेशन लॉन्चर से भी छुटकारा दिलाता है क्योंकि वास्तव में आवेदन को अलग करने के अलावा मेरे पास इसके लिए कोई उपयोग नहीं है। ऐसा करने के लिए, मैं वास्तव में यह जानना चाहूंगा कि शेल से एप्लिकेशन को "सही ढंग से" कैसे शुरू किया जाए। जिससे "सही ढंग से" का अनुमान लगाया जा सकता है जैसे "एक एप्लिकेशन लॉन्चर करेगा"।
मुझे शेल से प्रक्रियाओं को फैलाने के निम्नलिखित तरीकों के बारे में पता है:
exec /path/to/Programएक नई प्रक्रिया बनाए बिना निर्दिष्ट कमांड के साथ शेल को बदलेंsh -c /path/to/Programशेल आश्रित प्रक्रिया/path/to/Programशेल आश्रित प्रक्रिया/path/to/Program 2>&1 &लॉन्च शेल स्वतंत्र प्रक्रियाnohup /path/to/Program &लॉन्च शेल स्वतंत्र प्रक्रिया और आउटपुट को पुनर्निर्देशित करनाnohup.out
अद्यतन 1: मैं उदाहरण देकर बता सकता हूं कि विभिन्न स्थितियों में dmenuबार-बार कॉल से इसे फिर से बनाना क्या है ps -efl। यह एक नया शेल खोलता है /bin/bashऔर इस शेल के एक बच्चे के रूप में आवेदन करता है /path/to/Program। जब तक बच्चा चारों ओर है, तब तक शेल आसपास रहेगा। (यह कैसे प्रबंधित करता है यह मेरे से परे है ...) इसके विपरीत यदि आप nohup /path/to/Program &एक शेल से जारी करते हैं /bin/bashतो प्रोग्राम इस शेल का बच्चा बन जाएगा लेकिन यदि आप इस शेल से बाहर निकलते हैं तो प्रोग्राम का जनक अपरिपक्व प्रक्रिया होगी। इसलिए यदि पहली प्रक्रिया उदाहरण के लिए है /sbin/init verboseऔर यह है PPID 1तो यह कार्यक्रम का जनक होगा। यहाँ मैंने एक ग्राफ़ का उपयोग करके समझाने की कोशिश की: के chromiumमाध्यम से लॉन्च किया गया था dmenu, firefoxका उपयोग करके लॉन्च किया गया था exec firefox & exit:
systemd-+-acpid
|-bash---chromium-+-chrome-sandbox---chromium-+-chrome-sandbox---nacl_helper
| | `-chromium---5*[chromium-+-{Chrome_ChildIOT}]
| | |-{Compositor}]
| | |-{HTMLParserThrea}]
| | |-{OptimizingCompi}]
| | `-3*[{v8:SweeperThrea}]]
| |-chromium
| |-chromium-+-chromium
| | |-{Chrome_ChildIOT}
| | `-{Watchdog}
| |-{AudioThread}
| |-3*[{BrowserBlocking}]
| |-{BrowserWatchdog}
| |-5*[{CachePoolWorker}]
| |-{Chrome_CacheThr}
| |-{Chrome_DBThread}
| |-{Chrome_FileThre}
| |-{Chrome_FileUser}
| |-{Chrome_HistoryT}
| |-{Chrome_IOThread}
| |-{Chrome_ProcessL}
| |-{Chrome_SafeBrow}
| |-{CrShutdownDetec}
| |-{IndexedDB}
| |-{LevelDBEnv}
| |-{NSS SSL ThreadW}
| |-{NetworkChangeNo}
| |-2*[{Proxy resolver}]
| |-{WorkerPool/1201}
| |-{WorkerPool/2059}
| |-{WorkerPool/2579}
| |-{WorkerPool/2590}
| |-{WorkerPool/2592}
| |-{WorkerPool/2608}
| |-{WorkerPool/2973}
| |-{WorkerPool/2974}
| |-{chromium}
| |-{extension_crash}
| |-{gpu-process_cra}
| |-{handle-watcher-}
| |-{inotify_reader}
| |-{ppapi_crash_upl}
| `-{renderer_crash_}
|-2*[dbus-daemon]
|-dbus-launch
|-dhcpcd
|-firefox-+-4*[{Analysis Helper}]
| |-{Cache I/O}
| |-{Cache2 I/O}
| |-{Cert Verify}
| |-3*[{DOM Worker}]
| |-{Gecko_IOThread}
| |-{HTML5 Parser}
| |-{Hang Monitor}
| |-{Image Scaler}
| |-{JS GC Helper}
| |-{JS Watchdog}
| |-{Proxy R~olution}
| |-{Socket Thread}
| |-{Timer}
| |-{URL Classifier}
| |-{gmain}
| |-{localStorage DB}
| |-{mozStorage #1}
| |-{mozStorage #2}
| |-{mozStorage #3}
| |-{mozStorage #4}
| `-{mozStorage #5}
|-gpg-agent
|-login---bash---startx---xinit-+-Xorg.bin-+-xf86-video-inte
| | `-{Xorg.bin}
| `-dwm-+-dwmstatus
| `-xterm---bash-+-bash
| `-pstree
|-systemd---(sd-pam)
|-systemd-journal
|-systemd-logind
|-systemd-udevd
|-wpa_actiond
`-wpa_supplicant
अद्यतन 2: मुझे लगता है कि प्रश्न को भी उबाला जा सकता है: किसी प्रक्रिया का जनक क्या होना चाहिए? यह उदाहरण के लिए एक खोल होना चाहिए या यह initप्रक्रिया होना चाहिए अर्थात प्रक्रिया के साथ PID 1?
init- जिसका उत्तर हो सकता है ... हो सकता है? यह इस बात पर निर्भर करता है कि आप कैसे / क्या बात करते हैं, क्या initउपयोग करते हैं और डेटा चैनल कहां हैं। सामान्य तौर पर वह सामान अपने आप काम करना शुरू कर देगा - यही वह initहै जिसके लिए है। किसी भी मामले में, आमतौर पर जब आप एक प्रक्रिया को समाप्त करते हैं init। या यदि आप नौकरी पर नियंत्रण चाहते हैं, तो वर्तमान शेल।
dmenuऔर देखूंगा कि मैंने जो कुछ भी सीखा, उसके साथ कैसे मिला। मुझे लगता है exec /path/to/Program & exitया /bin/bash -c /path/to/Program & exitकाफी प्रयोग करने योग्य है। लेकिन वे सभी बनाते हैं 1अर्थात जब तक मेरे initमाता-पिता Programठीक हैं, जब तक यह समझ में आता है और किसी भी मूल *nixसिद्धांतों का उल्लंघन नहीं करता है ।
exec &, मुझे लगता है। मैं आमतौर पर टर्मिनल से अपना सामान लेती हूं ... शायद आपको बेन क्राउल के सवाल से कुछ फायदा होगा । मेरे पास वहां एक उत्तर है, लेकिन वे सभी बहुत अच्छे हैं। वैसे भी, जब आप एक प्रक्रिया की पृष्ठभूमि बनाते हैं और उसके माता-पिता की मृत्यु हो जाती है, जैसे: sh -c 'cat & kill $$'आप इसे अनाथ कर देते हैं, और यह अंततः समाप्त हो जाता है। यह init का काम है - यही कारण है कि वे सभी इसके लिए आते हैं।
systemd--bash--chromium:। सभी तरीके जो मैं कोशिश करता हूं, अंत systemd--chromiumमें शेल से फ़ायरफ़ॉक्स को छिड़कते समय निम्नलिखित रूप के एक प्रक्रिया वृक्ष का नेतृत्व करेंगे । यहाँ शैल को किस तरह से चित्रित किया गया है? यह किसी भी टर्मिनल से संबद्ध नहीं है।