Почему утилита-linux runuser (su) вилка?

Используя runuser из util-linux (другая точка входа для su , которая работает только при запуске с корня), можно увидеть дерево процессов, которое выглядит примерно так:

 [root] runuser -u username sometool \- [username] sometool 

Какова цель сохранения этого родительского процесса, а не просто сброса привилегий и выполнения цели?

Как вы видите на странице руководства:

Команда -session-command = То же, что и -c, но не создавайте новый сеанс (обескуражен).

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

Кроме того, код возврата зависит от статуса выхода или от сигнала, который убил процесс. Этот последний пункт также требует процесса мониторинга состояния дочернего процесса.

Я думаю, что это связано с дизайном. В отличие от su , IMO, runuser используется для использования в скриптах (поэтому никогда не запрашивайте пароль, не обрабатывайте состояние ошибки лучше, а также отдельные обработки сигналов (новый сеанс) от вызывающего.

Какова цель сохранения этого родительского процесса вокруг

Я прочитал через create_watching_parent в исходном коде su-common.c . Похоже, что родитель остается вокруг, чтобы он мог сделать следующее:

  • родительский cleanup_pam после выхода дочернего cleanup_pam
  • если ребенок вышел из-за сигнала, родительский принт (to stderr) расположения ребенка, аналогичного способу оболочки.
  • если родитель получает сигнал SIGINT, SIGQUIT или SIGTERM, родитель поймает сигнал и убьет ребенка SIGTERM, а затем SIGKILL, а затем убьет себя тем же сигналом, который он получил. Я предполагаю, что это делает так, что пользователю просто прекратить команду в ситуациях, когда ребенок перешел на другой сеанс или pgrp.