Soruyu tam olarak ifade etmekte zorlanıyorum ama elimden geleni yapacağım. Kullandığım dwmvarsayılan pencere yöneticisi olarak vedmenubenim uygulama başlatıcı olarak. GUI uygulamalarını tarayıcım dışında neredeyse hiç kullanmıyorum. İşlerimin çoğu doğrudan komut satırından yapılır. Ayrıca, işletim sistemleri, uygulamalar vb. İle ilgili çok az bir minimalizm hayranıyım. Hiç kurtulamadığım araçlardan biri de bir uygulama başlatıcıydı. Temel olarak, uygulama başlatıcılarının nasıl çalıştığı / ne yaptıkları konusunda tam bir anlayışım olmadığı için. Kapsamlı internet araması bile sadece belirsiz bir açıklama gösterir. Yapmak istediğim şey, uygulama başlatıcıdan bile kurtulmaktır, çünkü aslında uygulamayı yumurtlama dışında, bunun için kesinlikle kullanmıyorum. Bunu yapmak için uygulamaları kabuktan "doğru şekilde" nasıl başlatacağımı bilmek istiyorum. "Doğru" ifadesinin anlamı "bir uygulama başlatıcısının yaptığı gibi" ile yakınlaştırılabilir.
İşlemleri kabuktan çıkarmanın aşağıdaki yollarını biliyorum:
exec /path/to/Programyeni bir işlem oluşturmadan shell'i belirtilen komutla değiştirsh -c /path/to/Programkabuk bağımlı süreç başlatmak/path/to/Programkabuk bağımlı süreç başlatmak/path/to/Program 2>&1 &kabuktan bağımsız süreç başlatnohup /path/to/Program &Kabuktan bağımsız işlem başlatmak ve çıktıyınohup.out
Güncelleme 1: Örneğin dmenu, tekrarlanan çağrılardan ps -eflfarklı koşullar altında neyin yeniden yapılandırıldığını gösterebilirim . Yeni bir kabuk ortaya çıkarır /bin/bashve bu kabuğun alt öğesi olarak uygulamayı oluşturur /path/to/Program. Çocuk etrafta olduğu sürece kabuk etrafta olacaktır. (Bu nasıl yönetir benden öte ...) Buna karşılık nohup /path/to/Program &, bir kabuktan çıkarırsanız /bin/bash, program bu kabuğun alt öğesi olur, ancak bu kabuktan çıkarsanız, programın üst öğesi en üst süreç olacaktır. Yani eğer ilk süreç örnekse /sbin/init verboseve varsa, PPID 1programın üst öğesi olacaktır. Burada bir grafik kullanarak açıklamaya çalıştı budur: chromiumaracılığıyla başlatılan dmenu, firefoxkullanılarak başlatıldı 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
Güncelleme 2: Sanırım soru şu şekilde de kaynatılabilir: Bir sürecin ebeveyni ne olmalı? Örneğin bir kabuk olmalı mı inityoksa süreç PID 1mi yani süreç mi?
init- cevabın hangisi olabileceğini ... belki? onunla nasıl / ne şekilde konuşmayı planladığınıza, ne initkullandığınıza ve veri kanallarının nerede olduğuna bağlıdır. Genel olarak, bu şeyler kendini çözme eğiliminde olacaktır - bunun initiçin budur. Her durumda, genellikle bir süreci arka plana ayırdığınızda init. Veya iş kontrolü, mevcut kabuk istiyorsanız.
dmenuÖğrendiklerimle nasıl geçineceğimi göreceğim. Ben bulmak exec /path/to/Program & exitveya /bin/bash -c /path/to/Program & exitoldukça kullanışlı olması. Ama hepsi marka 1yani initebeveyni Programsürece bu mantıklı ve tüm baz ihlal etmediği şekilde bana uyar *nixilkeleri.
exec &, sanırım. Genellikle eşyamı terminalden yapıyorum ... belki ben burada crow'ın sorusundan biraz faydalanırsın . Orada bir cevabım var, ama hepsi çok iyi. Her neyse, bir süreci arka planladığınızda ve üst öğesi şu şekilde ölürse: sh -c 'cat & kill $$'yetimsiniz ve sonunda biçilir. bu init'in işi - bu yüzden hepsi ona düşüyor.
systemd--bash--chromium. Denediğim tüm yöntemler, systemd--chromiumfirefox'u kabuktan çıkardığımda sonuçta aşağıdaki formdaki bir işlem ağacına yol açacaktır . Kabuk burada nasıl şeytanlaştırılıyor? Herhangi bir terminal ile ilişkili değildir.