Запуск команды от имени другого пользователя в Linux с `su - user c` создает дублирующийся процесс

Я хочу запустить процесс службой от имени пользователя root, потому что у демона может быть свой пользователь.

Но когда я запускаю его с system("su - root c ./testbin"), система показывает два процесса (я проверяю это через ps aux | grep testbin):

su - root c ./testbin

а также

./testbin

Как добиться единого процесса?

2 ответа

Процесс "su" не может быть предотвращен, но вы можете завершить его раньше, чем это сделает тестбин. Ваш оригинальный вопрос с использованием "сна" выглядит так:

(su - root -c "sleep 120" &) ; ps aux | grep sleep

Если вы выполните эту строку несколько раз, вы увидите несколько процессов "su" в результате действия grep. Фоновая обработка подпроцесса позволяет завершить процесс su следующим образом:

(su - root -c "sleep 120 &" &) ; ps aux | grep sleep

Когда вы выполняете эту строку несколько раз, вы видите, что процессы "su" исчезают из списка, но команды sleep продолжаются.

Обратите внимание, что амперсанд внутри двойных кавычек предназначен для подпроцесса, а амперсанд непосредственно перед скобками предназначен для команды 'su', которая требуется для выполнения вашего вопроса в одной строке и ускорения тестирования этого случая.

Я проверил, существует ли эквивалент 'execv' для командной строки, но, похоже, это не так. Также 'su' - это процесс, который запускается с разрешениями вызывающей стороны, а подпроцесс su выполняется с разрешениями процесса, разветвленного 'su'. Мне кажется логичным, что вы не можете заменить процесс 'su' его дочерним, как это делает 'execv' в 'C' по соображениям безопасности.

ps aux | grep testbin | grep -v grep

Я думаю, вы просто видите свой процесс "grep". Используйте команду выше.

Другие вопросы по тегам