Работа с процессом с gdb
почти никогда не бывает безопасной, хотя может быть необходимо, если есть какая-то чрезвычайная ситуация, и процесс должен оставаться открытым и все связанные с этим риски и код понятны.
Чаще всего я просто завершал процесс, хотя в некоторых случаях отличаться и может зависеть от окружающей среды, кому принадлежит соответствующие системы и задействованные процессы, что делает процесс, есть ли документация на тему "можно убить" или "нет, обращайтесь так что -и -так сначала» и т. д. Эти детали, возможно, придется проработать в после -посмертного собрания, как только уляжется пыль.Если есть запланированный миграции было бы хорошо заранее проверить, есть ли какие-либо процессы открывать проблемные файловые дескрипторы, чтобы с ними можно было справиться в не -аварийная настройка (задания cron или другие запланированные задачи, которые выполняются только в предрассветные часы, когда может выполняться миграция, легко пропустить, если вы проверяете только в дневное время ).
Ваша идея повторно открыть файловый дескриптор O_WRONLY
проблематична, поскольку не все файловые дескрипторы доступны только для записи -. Джон Вьега и Мэтт Мессье более тонкий подход в «Поваренной книге по безопасному программированию для C и C++» резервирование и обработка стандартного ввода иначе, чем стандартного вывода и стандартная ошибка (с. 25, «Безопасное управление файловыми дескрипторами»):
static int open_devnull(int fd) {
FILE *f = 0;
if (!fd) f = freopen(_PATH_DEVNULL, "rb", stdin);
else if (fd == 1) f = freopen(_PATH_DEVNULL, "wb", stdout);
else if (fd == 2) f = freopen(_PATH_DEVNULL, "wb", stderr);
return (f && fileno(f) == fd);
}
В случае gdb
дескриптор (или также FILE *
дескриптор )должен быть проверить, доступен ли он только для чтения -или для чтения -для записи или только для записи -и соответствующая замена открыта на /dev/null
. Если нет, то только однократное чтение -дескриптор, который теперь только для записи -, вызовет ненужные ошибки, если процесс пытается прочитать из этого.
Как именно ведет себя процесс, когда его файловые дескрипторы (и, вероятно, также FILE *
ручки )возятся за кадром будет зависеть от процесс и будет варьироваться от «ничего страшного», если этот дескриптор никогда не будет привык к «кошмарному режиму», где теперь где-то есть поврежденный файл из-за к несброшенным данным, ни один файл -не был -должным образом -закрытым индикатором или каким-либо другим непредвиденная проблема.
Для FILE *
обрабатывает добавление вызова fflush(3)
перед закрытием дескриптор может помочь или может вызвать двойную буферизацию или какую-то другую проблему; это одна из нескольких опасностей случайных звонков в gdb
не зная точно, что исходный код делает и ожидает.Программное обеспечение также могут иметь дополнительные уровни сложности, построенные поверх fd
дескрипторы или дескрипторы FILE *
, с которыми, возможно, также потребуется разобраться. Обезьяна, исправляющая код, может достаточно легко превратиться в гаечный ключ.
Отправка процессу стандартного сигнала завершения должна дать ему шанс для правильного закрытия ресурсов, так же, как и при выключении системы как обычно. Возиться с процессом с gdb
, скорее всего, не получится должным образом. закрыть вещи, и может сделать ситуацию намного хуже.
Ты почти у цели, друг мой. SAN должен содержать как исходный CN (zevrant -, уведомление -, службу ), так и альтернативное имя (10.105.135.223 )
.В настоящее время у вас есть 10.105.135.223 в качестве SAN, что делает недействительной исходную службу CN (zevrant -уведомления -).