Проблема: приложение C ++ изменяет права доступа к каталогу при завершении работы - PullRequest
1 голос
/ 24 сентября 2019

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

Сначала несколько замечаний об этом приложении:

  • Требуется для запуска от имени пользователя root
  • Работает в операционной системе Solaris 10
  • Скомпилировано для C ++ 14
  • Нормальное отключение выполняется при получении SIGTERM
  • Записывает файл журнала (явно устанавливает разрешения на 660) в каталог данных (с разрешениями по умолчанию 770)

Приложение работает нормально и делает все, что должно делать, вплоть до момента его завершения.После завершения приложение меняет разрешения для каталога данных с 770 на 660.

Мои коллеги так же озадачены, как и я.Даже наш системный администратор не понимает, почему это происходит.

То, что я пробовал:

  • Заявления о печати: Приложение сообщает, что права доступа к каталогу составляют 770 до exitили return операторов
  • Проверка ведения журнала: механизм ведения журнала используется совместно с несколькими другими приложениями, ни у одного из которых нет этой проблемы
  • Запуск от имени самого себя: разрешения каталога не изменяются при завершении
  • Измените значение umask на 027: разрешения для каталога по-прежнему изменены на 660
  • Проверьте системные журналы: в журналах sudo и messages не отображаются никакие вызовы chmod для каталога (кроме тех, которые сделаны дляверните обратно разрешения)

В связи с характером приложения я не могу предоставить здесь какой-либо код для проверки / проверки.Кроме того, многие из стандартных инструментов диагностики недоступны в рассматриваемой системе.

Однако я надеюсь, что гуру могут дать представление о том, что может быть причиной этой проблемы, куда смотреть в будущее или (в идеале) как это исправить.

1 Ответ

1 голос
/ 25 сентября 2019

Вы можете использовать следующий простой скрипт dTrace для получения трассировки стека от любого процесса, который вызывает chmod() (или любой из его вариантов, таких как fchmod() или fchmodat()):

#!/usr/sbin/dtrace -s

syscall::fchmodat:entry
{
    printf{ "\nExecname: %s\n", execname );
    ustack();
}

Вы можете фильтровать по execname, чтобы печатать только стеки вызовов chmod из вашего исполняемого файла с помощью

#!/usr/sbin/dtrace -s

syscall::fchmodat:entry
/ execname == "yourExecName" /
{
    ustack();
}

Вы можете добавить больше или меньше кадров стека с помощью ustack( 10 );, чтобы напечатать, например, 10 кадров стека.Если вы хотите использовать более длинные или более короткие имена функций в трассировке стека, вы можете указать длину строки с помощью ustack( 10, 50 ); для печати 10 кадров стека, при этом каждое имя функции печатает до 50 символов.

Если ваш двоичный файл полностью заполненбез имен символов вы можете не получить имена функций, только адреса.

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

После того, как вы получите трассировку стека, вы можетеначать работать над тем, что именно происходит.

...