GID является основным идентификатором группы. Что касается системы, другой GID является другой группой. Таким образом для изменения GID Вы оказываетесь перед необходимостью изменять все места где, что GID используется.
Необходимо постараться не рассматривать GID как значительный и названия группы использования вместо этого; можно изменить имя группы с единственной командой (на Linux: groupmod -n NEW_GROUP_NAME OLD_GROUP_NAME
).
Однако, если Вы действительно хотите изменить GID, это то, как:
groupmod -g NEWGID GROUPNAME
. В других системах используйте административное средство той системы, или vigr
при наличии, или редактирование /etc/group
как применимый.Измените группу всех файлов в Вашей системе, которые принадлежат старой группе.
find / -gid OLDGID ! -type l -exec chgrp NEWGID {} \;
chgrp очищает suid и флаги sgid, восстановите их.
Я соглашаюсь с Вашим анализом, и я соглашаюсь, что он кажется, что необходимо обнаружить, является ли группа процесса осиротевшей или нет.
tcsetattr
также предназначен для возврата EIO
если группа процесса является осиротевшей (и мы не блокируем/игнорируем SIGTTOU. Это могло бы быть менее навязчивым путем, чем a read
на терминале.
Обратите внимание, что можно воспроизвести его с:
(bash<&1 &)
Вам нужно перенаправление иначе stdin, перенаправляется к/dev/null при выполнении команды в фоновом режиме.
(bash<&1 & sleep 2)
Дает еще более странное поведение, как, потому что Вы заканчиваете с двумя оболочками, читающими из терминала. Они игнорируют SIGTTIN
и новый не обнаруживает, после того как он запускается, что это больше не находится в группе приоритетного процесса.
ksh93
решение не так плохо: только подойдите 20 раз (вместо большого количества) через тот цикл перед отказом.