질문을 정확하게 표현하기는 어렵지만 최선을 다하겠습니다. 내가 사용하는 dwm
내 기본 창 관리자로 및dmenu
내 응용 프로그램 실행기로. 브라우저 외에 GUI 응용 프로그램을 거의 사용하지 않습니다. 내 작업의 대부분은 명령 줄에서 직접 수행됩니다. 또한, 나는 운영 체제, 응용 프로그램 등에 관한 미니멀리즘의 열렬한 팬입니다. 내가 제거하지 못한 도구 중 하나는 응용 프로그램 실행기였습니다. 주로 애플리케이션 런처의 작동 방식 / 동작에 대한 정확한 이해가 부족하기 때문입니다. 광범위한 인터넷 검색조차도 모호한 설명 만 표시합니다. 내가 실제로하고 싶은 것은 실제로 응용 프로그램을 생성하는 것 외에는 절대 사용하지 않기 때문에 응용 프로그램 시작 관리자를 제거하는 것입니다. 이를 위해 쉘에서 응용 프로그램을 "올바르게"시작하는 방법을 알고 싶습니다. "올바로"의 의미는 "응용 프로그램 실행기와 같은"방식으로 근사 할 수 있습니다.
쉘에서 프로세스를 생성하는 다음 방법에 대해 알고 있습니다.
exec /path/to/Program
새로운 프로세스를 생성하지 않고 지정된 명령으로 쉘을 교체sh -c /path/to/Program
쉘 종속 프로세스 시작/path/to/Program
쉘 종속 프로세스 시작/path/to/Program 2>&1 &
쉘 독립 프로세스 시작nohup /path/to/Program &
쉘 독립 프로세스를 시작하고 출력을nohup.out
업데이트 1 : dmenu
반복 호출 ps -efl
에서 다른 조건 으로 재구성하는 것, 예를 들어 설명 할 수 있습니다 . 새로운 쉘을 만들고이 쉘 /bin/bash
의 자식으로 응용 프로그램을 /path/to/Program
만듭니다. 아이가 주변에있는 한 껍질이 주변에있을 것입니다. (이것을 관리하는 방법은 저쪽에 있습니다 ...) 반대로 nohup /path/to/Program &
쉘에서 발행 /bin/bash
하면 프로그램은이 쉘의 자식이되지만이 쉘을 종료하면 프로그램의 부모가 최상위 프로세스가됩니다. 따라서 첫 번째 프로세스가 예 /sbin/init verbose
이고 프로세스가 있으면 PPID 1
프로그램의 상위 프로세스가 됩니다. 저는 여기에 그래프를 사용하여 설명하려 내용은 다음과 같습니다 chromium
통해 출시 된 dmenu
, firefox
사용 시작되었다 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
업데이트 2 : 질문은 다음과 같이 요약 될 수 있습니다. 프로세스의 부모는 무엇이되어야합니까? 예를 들어 쉘이어야합니까 아니면 init
프로세스 즉, PID 1
?
init
-대답이 어쩌면? 그것은 당신이 그것과 대화 할 계획인지, 어떻게 init
사용하는지, 데이터 채널이 어디에 있는지에 달려 있습니다. 일반적으로 물건은 잘 작동하는 경향이 있습니다 init
. 어쨌든 일반적으로 프로세스를 데몬화할 때 init
. 또는 작업 제어, 현재 쉘을 원할 경우.
dmenu
배운 것을 어떻게 제거 하고 제거 할 것인가. 나는 아주 쓸모가 exec /path/to/Program & exit
있거나 찾을 /bin/bash -c /path/to/Program & exit
수있다. 그러나 모든 메이크업 1
즉 init
의 부모 Program
만큼이 말이하고 기본 위반하지 않는 한 나와 함께 괜찮 *nix
원칙을.
systemd--bash--chromium
. 쉘에서 위의 프로세스 트리를 얻는 방법은 무엇입니까 ? 내가 시도하는 모든 방법은 궁극적으로 systemd--chromium
쉘에서 파이어 폭스를 생성 할 때 다음과 같은 형식의 프로세스 트리로 이어질 것 입니다. 껍질은 어떻게 악마입니까? 터미널과 관련이 없습니다.