Intereting Posts
Команда sar vs / proc / stat для использования процессора mv: невозможно удалить каталог: каталог не пуст Есть ли инструмент командной строки для управления сигналами unix? Обновлен рабочий стол Debian Stable (Jessie), не подключенный к проводному Интернету URL Rewrite на debian не работает Кали отключается от WiFi при использовании инструментов Автоматическое обновление GCC до более поздней версии без обновления дистрибутива Как эхо-строку с несколькими пробелами в bash «нетронутой»? Есть ли способ для `ls -d`, когда не передано никаких аргументов, пропустить отображение` .`? Восстановить раздел Mac Могу ли я ограничить количество часов inotify доступными для процесса или группы? Перекрестные запросы от VLAN в dnsmasq Может перезагрузить систему, перезагружая службу, как это делает systemctl? Вставка скрипта Sed и добавление в неправильное место только в одном конкретном месте Kernelpanic Fedora 18 с ядром 3.9.2-200

Возможно ли повторное использование оболочки?

Этот вопрос тесно связан с тем, как «правильно» запустить приложение из оболочки, но пытается решить более конкретную проблему. Как я могу создать приложение из оболочки и тем самым сделать его дочерним по отношению к другому процессу. Вот что я имею в виду, например, с двумя графиками:

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 

Дерево процессов показывает хром и firefox как дочерние init процесса init который запускается при загрузке и имеет PID 1 . Но то, что я хочу достичь, – это запустить firefox и chromium как дети dwm . Следовательно, я хочу, чтобы подобное поведение было похоже на то, что вы видите под частью weston следующего дерева процессов, где firefox имеет weston-desktop качестве родителя:

 systemd-+-acpid |-bash---chromium-+-chrome-sandbox---chromium-+-chrome-sandbox---nacl_helper | | `-chromium-+-3*[chromium-+-{Chrome_ChildIOT}] | | | |-{Compositor}] | | | |-{HTMLParserThrea}] | | | |-{OptimizingCompi}] | | | `-3*[{v8:SweeperThrea}]] | | `-4*[chromium-+-{Chrome_ChildIOT}] | | |-{CompositorRaste}] | | |-{Compositor}] | | |-{HTMLParserThrea}] | | |-{OptimizingCompi}] | | `-3*[{v8:SweeperThrea}]] | |-{AudioThread} | |-3*[{BrowserBlocking}] | |-{BrowserWatchdog} | |-5*[{CachePoolWorker}] | |-{Chrome_CacheThr} | |-{Chrome_DBThread} | |-{Chrome_FileThre} | |-{Chrome_FileUser} | |-{Chrome_HistoryT} | |-{Chrome_IOThread} | |-{Chrome_ProcessL} | |-{Chrome_SafeBrow} | |-{Chrome_SyncThre} | |-{CrShutdownDetec} | |-{IndexedDB} | |-{NSS SSL ThreadW} | |-{NetworkChangeNo} | |-2*[{Proxy resolver}] | |-{WorkerPool/2315} | |-{WorkerPool/2316} | |-{WorkerPool/2481} | |-{chromium} | |-{extension_crash} | |-{gpu-process_cra} | |-{handle-watcher-} | |-{inotify_reader} | |-{renderer_crash_} | `-{sandbox_ipc_thr} |-2*[dbus-daemon] |-dbus-launch |-dhcpcd |-gpg-agent |-login---bash---startx---xinit-+-Xorg.bin-+-xf86-video-inte | | `-{Xorg.bin} | `-dwm-+-dwmstatus | `-xterm---bash |-login---bash---weston-launch---weston-+-Xwayland---4*[{Xwayland}] | |-weston-desktop--+-firefox-+-firefox | | | |-4*[{Analysis Helper}] | | | |-{Cache2 I/O} | | | |-{Cert Verify} | | | |-{DNS Resolver #1} | | | |-{DNS Resolver #2} | | | |-2*[{DOM Worker}] | | | |-{Gecko_IOThread} | | | |-{HTML5 Parser} | | | |-{Hang Monitor} | | | |-{Image Scaler} | | | |-{ImageDecoder #1} | | | |-{ImageDecoder #2} | | | |-{ImageDecoder #3} | | | |-{JS GC Helper} | | | |-{JS Watchdog} | | | |-{Socket Thread} | | | |-{Timer} | | | |-{URL Classifier} | | | |-{gmain} | | | |-{localStorage DB} | | | |-{mozStorage #1} | | | |-{mozStorage #2} | | | |-{mozStorage #3} | | | |-{mozStorage #4} | | | `-{mozStorage #5} | | `-weston-terminal---bash---pstree | `-weston-keyboard |-systemd---(sd-pam) |-systemd-journal |-systemd-logind |-systemd-udevd |-tmux---bash |-wpa_actiond `-wpa_supplicant 

Одним из возможных решений было бы использование nsenter из util-linux . Я мог бы ввести пространство имен процесса dwm и разблокировать новый процесс firefox, который затем будет дочерним элементом dwm . Однако это похоже на большую работу. Есть ли более простой способ сделать это?

Вы не можете запустить процесс как дочерний элемент оболочки, а затем «повторить», чтобы другой процесс стал его родителем.

Поэтому вам нужно использовать родительский процесс, который явно запускает дочерние элементы.

init с PID 1 является исключением, процессы могут стать его дочерним, поскольку он собирает процессы, которые потеряли исходный родительский процесс.

(С выскочкой могут быть несколько процессов init , они не разделяют PID 1, но в остальном роли очень похожи.)
(См. Также PR_SET_CHILD_SUBREAPER in man 2 prctl )

То, о чем вы просите, просто невозможно. По дизайну внутреннего процесса управления Unix и Linux init становится родителем всех процессов, родители которых умирают. Это связано с тем, что процессы должны иметь родителей (также по дизайну), и init всегда существует, поскольку если init умирает, система отключается. Но помимо этого не существует таких процессов, как «перевоспитание».

РЕДАКТИРОВАТЬ

Однако: Как отметил lord.garbage, есть системный вызов arcane prctl() который злобно крут и делает любую программу, которая использует его unportable. Предположим, нам все равно. Используя параметр PR_SET_CHILD_SUBREAPER он может wait() не только для своих собственных детей (как и раньше), но и для всех их потомков, если их родители умирают преждевременно. Таким образом, процесс, использующий эту функцию, может взять на себя роль init для своих потомков. Следующий код является доказательством концепции:

 #include <sys/prctl.h> #include <sys/wait.h> #include <unistd.h> #include <stdio.h> int main (int argc, const char* const argv[], char* const envp[]) { pid_t pid; if (prctl(PR_SET_CHILD_SUBREAPER, 1, 0, 0, 0) < 0) { perror("prctl"); return 4; } pid = fork(); if (pid < 0) { perror("fork"); return 4; } if (pid == 0) { // child char* const argv[] = { "/usr/bin/konsole", "-e", "/bin/bash", NULL }; if (execve("/usr/bin/konsole", argv, envp) < 0) { perror("execve"); } } // parent while (1) { pid_t wpid; int s; wpid = waitpid(-1, &s, 0); if (wpid > 0) { printf("child with pid %u has exited\n", wpid); } } return 0; } 

Запустите некоторые программы в фоновом режиме, которые не нуждаются в посещении оболочки, выйдите из консоли, запустите ps , выйдите из программ и посмотрите, что произойдет. Замените konsole на все, что пожелает ваше сердце.

Теперь, чтобы достичь того, чего вы хотите, используйте вызов prctl() как в PoC, а затем execve() в dwm . И надеюсь, что dwm wait() s для неспецифических детей, чтобы они не оказались зомби.

Заключительное примечание: до сих пор нет такой вещи, как перевоспитание. Т.е. вы все равно не можете произвольно назначить родителя процессу.

Я не верю, что вы можете отправить процесс в dwm-процесс как родитель. Но если вы могли бы запустить экран или оболочку в качестве дочернего процесса dwm, тогда вы могли бы восстановить свои желаемые процессы. См. Эту ссылку для получения дополнительной информации: http://monkeypatch.me/blog/move-a-running-process-to-a-new-screen-shell.html