Saya merasa sulit untuk mengungkapkan pertanyaan dengan tepat, tetapi saya akan memberikan yang terbaik. Saya menggunakan dwmsebagai manajer jendela default dandmenusebagai 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/Programganti shell dengan perintah yang ditentukan tanpa membuat proses barush -c /path/to/Programmeluncurkan proses tergantung shell/path/to/Programmeluncurkan 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 dmenumerekonstruksi dari panggilan berulang ke ps -efldalam kondisi yang berbeda. Ini memunculkan shell baru /bin/bashdan 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/bashmaka 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 verbosedan telah PPID 1maka itu akan menjadi induk program. Inilah yang saya coba jelaskan menggunakan grafik: chromiumdiluncurkan via dmenu, firefoxdiluncurkan 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 initproses yaitu proses dengan PID 1?
init- yang jawabannya mungkin ... mungkin? itu tergantung pada bagaimana / jika Anda berencana untuk berbicara dengannya, apa yang initAnda 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.
dmenudan melihat bagaimana saya cocok dengan apa yang saya pelajari. Saya menemukan exec /path/to/Program & exitatau /bin/bash -c /path/to/Program & exitcukup berguna. Tapi mereka semua make 1yaitu initinduk dari Programyang baik-baik saja dengan saya selama ini masuk akal dan tidak melanggar dasar *nixprinsip-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--chromiumketika saya menelurkan firefox dari shell. Bagaimana cangkang ini di iblis di sini? Itu tidak terkait dengan terminal apa pun.