Блог Олега Сердюкова

Поиск родительского процесса на примере одной странной ситуации

Сегодня, перезагрузив ноутбук, я удивился странной дисковой активности - я не запускал ни одного ресурсоёмкого приложения, но MenuMeters показывал 1K+ обращений к диску.

“Непорядок” - решил я и привычно расчехлил dtrace:

$ sudo /usr/sbin/dtrace -n \
	'syscall::open*:entry {printf("%s %s", execname, copyinstr(arg0));}'

Результатом было обилие строк вида:

1  19256              open_nocancel:entry find AppleLowshelf.nib
1  19256              open_nocancel:entry find AppleMultiband.nib
1  19256              open_nocancel:entry find AppleParametricEQ.nib
1  19256              open_nocancel:entry find DLSUI.nib
1  19256              open_nocancel:entry find Italian.lproj

find… Я не запускал его. Кто же?

$ ps ax | grep find | grep -v grep
265   ??  UN     0:36.76 find -s / ! ( -fstype hfs -or -fstype ufs ) -prune -or -path /private/tmp -prune -or -path /private/var/folders -prune -or -path /private/var/tmp -prune -or -path */Backups.backupdb -prune -or -print

Номер процесса у меня появился, но вот что дальше? Нужно найти родительский процесс, запустивший этот find…

Update. Спасибо opti и tsybulin за комментарии - поиск родительского процесса можно сделать в иерархическое представление в Activity Monitor или же командой “ps -Ao pid,ppid,command”. Но вот без dtrace не обойтись - в Activity Monitor может отразиться CPU, но не дисковая активность процесса.

К сожалению, я не смог вспомнить штатную утилиту Mac OS X, позволяющую строить дерево процессов, а время торопило - find мог закончиться до того, как я нашёл бы решение. Поэтому мне на помощь пришёл MacPorts, с помощью него я быстро поставил pstree, делающая именно то, что мне было нужно, а именно строящая подробное дерево процессов с указанием подчинённости процессов.

$ port search pstree
pstree @2.33 (sysutils)
    pstree shows the output of the ps command as a tree
$ sudo port install pstree

Записав дерево процессов в файл, я быстро определил, кто же запустил процесс find:

$ pstree > ps.txt
$ view ps.tree
 |-+= 00216 root /bin/sh /usr/libexec/locate.updatedb
 | \-+- 00243 root su -fm nobody -c /usr/libexec/locate.updatedb
 |   \-+= 00260 nobody /bin/sh /usr/libexec/locate.updatedb
 |     |--- 00265 nobody find -s / ! ( -fstype hfs -or -fstype ufs ) -prune -or -path /private/tmp -prune -or -path /private/var/folders -prune -or -path /private/var/tmp -prune -or -path */Backups.backupdb -prune -or -print
 |     \-+- 00266 nobody /bin/sh /usr/libexec/locate.mklocatedb -presort
 |       \--- 00268 nobody locate.code /tmp/locatepPGiUebwvm/mklocates1B1ib6Fqw/_mklocatedb266.bigrams

Ложная тревога - виновником был locate.updatedb, который обновляет базу данных locate для быстрого поиска файлов в shell. Например:

$ locate httpd-vhosts.conf
/opt/local/apache2/conf/extra/httpd-vhosts.conf
/private/etc/apache2/extra/httpd-vhosts.conf
/private/etc/apache2/original/extra/httpd-vhosts.conf

“It is typically run once a week by the /System/Library/LaunchDaemons/com.apple.locate.plist job.” Неделя прошла, процесс при старте системы запустился.

Источник странной активности найден, снова впал у умиротворённое состояние. Надолго ли?

Comments