Saya merasa sulit untuk mengungkapkan pertanyaan dengan tepat, tetapi saya akan memberikan yang terbaik. Saya menggunakan dwm
sebagai manajer jendela default dandmenu
sebagai peluncur aplikasi saya. Saya jarang menggunakan aplikasi GUI selain dari browser saya. Sebagian besar pekerjaan saya dilakukan langsung dari baris perintah. Selain itu, saya penggemar minimalis tentang sistem operasi, aplikasi, dll. Salah satu alat yang tidak pernah saya singkirkan adalah peluncur aplikasi. Terutama karena saya tidak memiliki pemahaman yang tepat tentang cara kerja peluncur aplikasi / apa yang mereka lakukan. Bahkan pencarian internet yang luas hanya menunjukkan penjelasan yang tidak jelas. Yang ingin saya lakukan adalah menyingkirkan bahkan peluncur aplikasi saya karena selain benar-benar menelurkan aplikasi saya sama sekali tidak menggunakannya. Untuk melakukan ini, saya benar-benar ingin tahu cara "benar" memulai aplikasi dari shell. Dimana arti dari "dengan benar" dapat didekati dengan "seperti yang dilakukan peluncur aplikasi".
Saya tahu tentang cara-cara berikut untuk menelurkan proses dari shell:
exec /path/to/Program
ganti shell dengan perintah yang ditentukan tanpa membuat proses barush -c /path/to/Program
meluncurkan proses tergantung shell/path/to/Program
meluncurkan proses tergantung shell/path/to/Program 2>&1 &
luncurkan proses mandiri shellnohup /path/to/Program &
meluncurkan proses mandiri shell dan mengarahkan ulang output kenohup.out
Pembaruan 1: Saya dapat mengilustrasikan misalnya apa dmenu
merekonstruksi dari panggilan berulang ke ps -efl
dalam kondisi yang berbeda. Ini memunculkan shell baru /bin/bash
dan sebagai anak aplikasi ini shell /path/to/Program
. Selama anak itu ada, maka kulitnya akan ada. (Bagaimana mengelola ini di luar saya ...) Sebaliknya jika Anda mengeluarkan nohup /path/to/Program &
dari shell /bin/bash
maka program akan menjadi anak dari shell ini TETAPI jika Anda keluar dari shell ini induk program akan menjadi proses paling atas. Jadi jika proses pertama adalah eg /sbin/init verbose
dan telah PPID 1
maka itu akan menjadi induk program. Inilah yang saya coba jelaskan menggunakan grafik: chromium
diluncurkan via dmenu
, firefox
diluncurkan menggunakan 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
Pembaruan 2: Saya kira pertanyaannya juga dapat dirubah menjadi: Apa yang seharusnya menjadi induk dari suatu proses? Haruskah misalnya menjadi shell atau haruskah init
proses yaitu proses dengan PID 1
?
init
- yang jawabannya mungkin ... mungkin? itu tergantung pada bagaimana / jika Anda berencana untuk berbicara dengannya, apa yang init
Anda gunakan, dan di mana saluran data berada. Secara umum hal-hal itu akan cenderung bekerja dengan sendirinya - itulah gunanya init
. Dalam kasus apa pun, biasanya ketika Anda melakukan daemonisasi suatu proses init
. Atau jika Anda ingin kontrol pekerjaan, shell saat ini.
dmenu
dan melihat bagaimana saya cocok dengan apa yang saya pelajari. Saya menemukan exec /path/to/Program & exit
atau /bin/bash -c /path/to/Program & exit
cukup berguna. Tapi mereka semua make 1
yaitu init
induk dari Program
yang baik-baik saja dengan saya selama ini masuk akal dan tidak melanggar dasar *nix
prinsip-prinsip.
exec &
, saya pikir. Saya biasanya hanya melakukan barang-barang saya dari terminal ... mungkin Anda akan menggunakan pertanyaan ben crowell di sini . Saya punya jawaban di sana, tetapi semuanya sangat bagus. Lagi pula, ketika Anda melatar belakangi suatu proses dan orangtuanya mati seperti: sh -c 'cat & kill $$'
Anda menjadi yatim piatu, dan akhirnya akan menuai akhirnya. itu pekerjaan init - itu sebabnya mereka semua jatuh ke dalamnya.
systemd--bash--chromium
. Semua metode yang saya coba pada akhirnya akan mengarah ke pohon proses dari bentuk berikut systemd--chromium
ketika saya menelurkan firefox dari shell. Bagaimana cangkang ini di iblis di sini? Itu tidak terkait dengan terminal apa pun.