ฉันพบว่ามันยากที่จะตอบคำถามอย่างแม่นยำ แต่ฉันจะทำให้ดีที่สุด ฉันใช้dwm
เป็นตัวจัดการหน้าต่างเริ่มต้นและdmenu
เป็นตัวเรียกใช้แอปพลิเคชันของฉัน ฉันแทบจะไม่ได้ใช้แอปพลิเคชัน GUI นอกเหนือจากเบราว์เซอร์ของฉัน งานส่วนใหญ่ของฉันทำได้โดยตรงจากบรรทัดคำสั่ง นอกจากนี้ฉันเป็นแฟนตัวยงของความเรียบง่ายเกี่ยวกับระบบปฏิบัติการแอปพลิเคชั่นและอื่น ๆ หนึ่งในเครื่องมือที่ฉันไม่เคยได้รับคือตัวเปิดแอปพลิเคชัน สาเหตุหลักมาจากฉันขาดความเข้าใจที่แม่นยำในการทำงานของโปรแกรมเรียกใช้งาน / สิ่งที่พวกเขาทำ แม้การค้นหาทางอินเทอร์เน็ตที่ครอบคลุมจะแสดงคำอธิบายที่คลุมเครือเท่านั้น สิ่งที่ฉันต้องการจะทำคือกำจัดแม้กระทั่งตัวเรียกใช้งานแอปพลิเคชันของฉันเพราะนอกเหนือจากการวางไข่แอปพลิเคชันจริง ๆ แล้วฉันไม่ได้ใช้มันอย่างแน่นอน ในการทำเช่นนี้ฉันอยากจะรู้วิธีการ "เริ่มต้น" แอปพลิเคชันจากเปลือก โดยที่ความหมายของ "ถูกต้อง" สามารถประมาณได้โดย "เหมือนตัวเรียกใช้งานแอปพลิเคชันจะทำ"
ฉันรู้เกี่ยวกับวิธีต่อไปนี้เพื่อวางไข่กระบวนการจากเปลือก:
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
เงื่อนไขที่แตกต่างกัน มัน spawns เปลือกใหม่และเป็นลูกของนี้เปลือกแอพลิเคชัน/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: ฉันเดาว่าคำถามนี้สามารถถูกต้มลงไปที่: สิ่งที่ควรเป็น parent ของกระบวนการ ควรเช่นเป็นเชลล์หรือควรเป็นinit
กระบวนการเช่นกระบวนการด้วยPID 1
หรือไม่
init
- คำตอบที่อาจจะเป็น ... อาจจะ? มันขึ้นอยู่กับว่าคุณวางแผนที่จะพูดคุยกับมันสิ่งที่init
คุณใช้และช่องทางข้อมูล โดยทั่วไปแล้วสิ่งต่าง ๆ จะมีแนวโน้มที่จะทำงานออกเอง - นั่นคือสิ่งที่init
มีไว้สำหรับ ในกรณีใด ๆ โดยปกติเมื่อคุณ daemonize 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
เมื่อฉันวางไข่ Firefox จากเปลือก เปลือกปีศาจถูกทำลายที่นี่ได้อย่างไร? มันไม่ได้เกี่ยวข้องกับขั้วใด ๆ