Tôi thấy thật khó để diễn đạt câu hỏi một cách chính xác nhưng tôi sẽ cố gắng hết sức. Tôi sử dụng dwm
làm trình quản lý cửa sổ mặc định của mình vàdmenu
là trình khởi chạy ứng dụng của tôi. Tôi hầu như không sử dụng các ứng dụng GUI ngoài trình duyệt của mình. Hầu hết công việc của tôi được thực hiện trực tiếp từ dòng lệnh. Hơn nữa, tôi là một fan hâm mộ lớn của chủ nghĩa tối giản liên quan đến hệ điều hành, ứng dụng, vv Một trong những công cụ tôi chưa bao giờ loại bỏ là trình khởi chạy ứng dụng. Chủ yếu là vì tôi thiếu hiểu biết chính xác về cách các trình khởi chạy ứng dụng hoạt động / những gì chúng làm. Ngay cả tìm kiếm trên internet rộng lớn chỉ hiển thị giải thích mơ hồ. Những gì tôi muốn làm là loại bỏ ngay cả trình khởi chạy ứng dụng của mình bởi vì ngoài việc thực sự sinh ra ứng dụng, tôi hoàn toàn không sử dụng nó. Để làm điều này, tôi thực sự muốn biết cách "chính xác" khởi động các ứng dụng từ trình bao. Do đó, ý nghĩa của "chính xác" có thể được xấp xỉ bằng "giống như trình khởi chạy ứng dụng sẽ làm".
Tôi biết về các cách sau đây để sinh ra các quy trình từ vỏ:
exec /path/to/Program
thay thế shell bằng lệnh được chỉ định mà không tạo quy trình mớish -c /path/to/Program
khởi chạy quá trình phụ thuộc vỏ/path/to/Program
khởi chạy quá trình phụ thuộc vỏ/path/to/Program 2>&1 &
khởi động quá trình độc lập shellnohup /path/to/Program &
khởi chạy quy trình độc lập shell và chuyển hướng đầu ra sangnohup.out
Cập nhật 1: Tôi có thể minh họa những gì ví dụ như dmenu
tái cấu trúc nó từ các cuộc gọi lặp đi lặp lại ps -efl
trong các điều kiện khác nhau. Nó sinh ra một lớp vỏ mới /bin/bash
và là một đứa con của lớp vỏ này /path/to/Program
. Chừng nào đứa trẻ còn ở đó bao lâu thì cái vỏ sẽ ở xung quanh. (Cách nó quản lý cái này nằm ngoài tôi ...) Ngược lại nếu bạn phát hành nohup /path/to/Program &
từ shell /bin/bash
thì chương trình sẽ trở thành con của shell này NHƯNG nếu bạn thoát khỏi shell này, cha mẹ của chương trình sẽ là quá trình cao nhất. Vì vậy, nếu quá trình đầu tiên là ví dụ /sbin/init verbose
và nó có PPID 1
thì nó sẽ là cha mẹ của chương trình. Đây là những gì tôi đã cố gắng giải thích bằng biểu đồ: chromium
đã được khởi chạy qua dmenu
, firefox
được khởi chạy bằng 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
Cập nhật 2: Tôi đoán câu hỏi cũng có thể được rút gọn thành: Phụ huynh của một quá trình nên làm gì? Nó có nên là một cái vỏ hay nó phải là init
quá trình tức là quá trình với PID 1
?
init
- câu trả lời có thể là ... có thể? nó phụ thuộc vào cách / nếu bạn dự định nói chuyện với nó, những gì init
bạn sử dụng và nơi các kênh dữ liệu. Nói chung, công cụ đó sẽ có xu hướng tự giải quyết - đó là những gì init
dành cho. Trong mọi trường hợp, thường là khi bạn trình bày một quy trình sau đó init
. Hoặc nếu bạn muốn kiểm soát công việc, vỏ hiện tại.
dmenu
và xem làm thế nào tôi hòa hợp với những gì tôi đã học. Tôi tìm thấy exec /path/to/Program & exit
hoặc /bin/bash -c /path/to/Program & exit
là khá có thể sử dụng. Nhưng tất cả họ làm1
tức là init
phụ huynh của Program
đó là tốt với tôi chừng này có ý nghĩa và không vi phạm bất kỳ cơ bản *nix
nguyên tắc này.
exec &
Tôi nghĩ vậy. Tôi thường chỉ làm công việc của mình từ thiết bị đầu cuối ... có lẽ bạn sẽ sử dụng được câu hỏi của ben crowell ở đây . Tôi có một câu trả lời ở đó, nhưng tất cả chúng đều rất tốt. dù sao đi nữa, khi bạn làm nền cho một quá trình và cha mẹ của nó chết như sau: sh -c 'cat & kill $$'
bạn mồ côi nó, và cuối cùng nó sẽ được gặt hái. đó là công việc của init - đó là lý do tại sao tất cả họ đều rơi vào nó.
systemd--bash--chromium
. Tất cả các phương pháp tôi thử cuối cùng sẽ dẫn đến một cây quy trình có dạng sau systemd--chromium
khi tôi sinh ra firefox từ vỏ. Làm thế nào là vỏ quỷ ở đây? Nó không liên quan đến bất kỳ thiết bị đầu cuối.