Я пытаюсь выяснить полный путь к файлу, который запущенная программа пытается (и не может) открыть. Мне дано понять это strace
могу это сделать, но я, видимо, неправильно использую. Запущенная программа - это служба, поэтому я не вижу простого способа запустить ее под strace
прямо. Из примеров, которые я видел, кажется, что
$ sudo strace -p <process id> -e open,access
- правильное заклинание для присоединения к запущенному процессу, но когда я запускаю его, я не вижу вывода, даже если рассматриваемая программа регистрирует свою неудачную попытку открыть файл. Я даже не вижу вывода с
$ sudo strace -p 24249
Process 24249 attached - interrupt to quit
futex(0x7f650fe159d0, FUTEX_WAIT, 24250, NULL
Это похоже на то, что какой-либо фьютекс по какой-то причине отключают? Или это нормальный вывод для ситуации?
В любом случае, что я делаю не так?
Можно ли запустить strace для самой службы, то есть включить ее при запуске службы вручную.
strace -ffttTo /tmp/strace.out service <foo> start
И вставьте сгенерированный файл.
РЕДАКТИРОВАТЬ: поскольку не удается открыть файл, можете ли вы выполнить поиск по ключевому слову ENOENT или grep в строке No such file or directory
.
EDIT2: я снова увидел вывод и проверил страницу руководства futex. Итак, похоже, что что-то, обращающееся к ячейке памяти 0x7f650fe159d0, удерживает блокировку, возможно, общую блокировку и не снимает ее. Pid 24250 тоже аргумент. Вы можете проверить, что делает этот pid.
Также вы можете проверить, с какой функцией ядра связана pid 24249. Это можно показать с помощью опции wchan в ps -eo wchan <pid>
команда. Я не помню полный подробный список Wchan, но я получу это для вас завтра. (здесь довольно ночь).