मुझे सवाल का ठीक-ठीक उच्चारण करना कठिन लगता है लेकिन मैं अपना सर्वश्रेष्ठ दूंगा। मैं 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
में शेल से फ़ायरफ़ॉक्स को छिड़कते समय निम्नलिखित रूप के एक प्रक्रिया वृक्ष का नेतृत्व करेंगे । यहाँ शैल को किस तरह से चित्रित किया गया है? यह किसी भी टर्मिनल से संबद्ध नहीं है।