Soruyu tam olarak ifade etmekte zorlanıyorum ama elimden geleni yapacağım. Kullandığım dwm
varsayılan pencere yöneticisi olarak vedmenu
benim 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/Program
yeni bir işlem oluşturmadan shell'i belirtilen komutla değiştirsh -c /path/to/Program
kabuk bağımlı süreç başlatmak/path/to/Program
kabuk 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 -efl
farklı koşullar altında neyin yeniden yapılandırıldığını gösterebilirim . Yeni bir kabuk ortaya çıkarır /bin/bash
ve 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 verbose
ve varsa, PPID 1
programın üst öğesi olacaktır. Burada bir grafik kullanarak açıklamaya çalıştı budur: chromium
aracılığıyla başlatılan dmenu
, firefox
kullanı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ı init
yoksa süreç PID 1
mi yani süreç mi?
init
- cevabın hangisi olabileceğini ... belki? onunla nasıl / ne şekilde konuşmayı planladığınıza, ne init
kullandığı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 init
iç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 & exit
veya /bin/bash -c /path/to/Program & exit
oldukça kullanışlı olması. Ama hepsi marka 1
yani init
ebeveyni Program
sürece bu mantıklı ve tüm baz ihlal etmediği şekilde bana uyar *nix
ilkeleri.
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--chromium
firefox'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.