Что интерактивные оболочки должны сделать в осиротевших группах процесса?

GID является основным идентификатором группы. Что касается системы, другой GID является другой группой. Таким образом для изменения GID Вы оказываетесь перед необходимостью изменять все места где, что GID используется.

Необходимо постараться не рассматривать GID как значительный и названия группы использования вместо этого; можно изменить имя группы с единственной командой (на Linux: groupmod -n NEW_GROUP_NAME OLD_GROUP_NAME).

Однако, если Вы действительно хотите изменить GID, это то, как:

  • Во-первых, Вы, возможно, должны выйти из системы пользователи в группе и уничтожить процессы, у кого есть та группа как их эффективная, реальная или сохраненная группа.
  • Измените запись в базе данных группы. На Linux, запущенном groupmod -g NEWGID GROUPNAME. В других системах используйте административное средство той системы, или vigr при наличии, или редактирование /etc/group как применимый.
  • Измените группу всех файлов в Вашей системе, которые принадлежат старой группе.

    find / -gid OLDGID ! -type l -exec chgrp NEWGID {} \;
    
  • chgrp очищает suid и флаги sgid, восстановите их.

  • Если у Вас есть какой-либо архив, который использует старый GID, восстановите его.
  • Если у Вас есть какой-либо конфигурационный файл или сценарий, который ссылается на старый GID, обновите его.
  • Перезапустите все процессы, которые должны использовать новый GID.
10
23.05.2017, 15:40
1 ответ

Я соглашаюсь с Вашим анализом, и я соглашаюсь, что он кажется, что необходимо обнаружить, является ли группа процесса осиротевшей или нет.

tcsetattr также предназначен для возврата EIO если группа процесса является осиротевшей (и мы не блокируем/игнорируем SIGTTOU. Это могло бы быть менее навязчивым путем, чем a read на терминале.

Обратите внимание, что можно воспроизвести его с:

(bash<&1 &)

Вам нужно перенаправление иначе stdin, перенаправляется к/dev/null при выполнении команды в фоновом режиме.

(bash<&1 & sleep 2)

Дает еще более странное поведение, как, потому что Вы заканчиваете с двумя оболочками, читающими из терминала. Они игнорируют SIGTTIN и новый не обнаруживает, после того как он запускается, что это больше не находится в группе приоритетного процесса.

ksh93решение не так плохо: только подойдите 20 раз (вместо большого количества) через тот цикл перед отказом.

4
27.01.2020, 20:03

Теги

Похожие вопросы