Многие знают такие команды как ps, pgrep, pkill но в Solaris есть и другие команды, которые помогут вам в трудную минуту. Речь пойдёт о командах pfiles, pcred, pflags, pldd, pmap, psig, pstack, ptime, ptree, pwait, pwdx, pargs, preap
Тестовый стенд: Solaris 10/11
pfiles
Выводи список открытых файлов, дескрипторов, сокетов указанным процессом (в Solaris 10 нету строк offset):
# pfiles 962 962: /usr/lib/sendmail -Ac -q15m Current rlimit: 1024 file descriptors 0: S_IFCHR mode:0666 dev:530,0 ino:113246216 uid:0 gid:3 rdev:216,2 O_RDONLY|O_LARGEFILE /devices/pseudo/mm@0:null offset:0 1: S_IFCHR mode:0666 dev:530,0 ino:113246216 uid:0 gid:3 rdev:216,2 O_WRONLY|O_LARGEFILE /devices/pseudo/mm@0:null offset:0 2: S_IFCHR mode:0666 dev:530,0 ino:113246216 uid:0 gid:3 rdev:216,2 O_WRONLY|O_LARGEFILE /devices/pseudo/mm@0:null offset:0 3: S_IFDOOR mode:0444 dev:540,0 ino:47 uid:0 gid:0 size:0 O_RDONLY|O_LARGEFILE FD_CLOEXEC door to nscd[389] /system/volatile/name_service_door 4: S_IFCHR mode:0000 dev:530,0 ino:31049 uid:0 gid:0 rdev:234,46 O_WRONLY FD_CLOEXEC /devices/pseudo/log@0:conslog offset:0 5: S_IFREG mode:0600 dev:124,65543 ino:16463 uid:25 gid:25 size:32 O_WRONLY|O_LARGEFILE /var/spool/clientmqueue/sm-client.pid offset:32
Есть так же параметр -F для вывода процессов, даже если они контролируются другим процессом
pcred
Используется для определения/изменения real, effective UID/GID процессов. То есть при желании можно изменить владельца процесса прямо налету
# pcred 962 962: e/r/suid=25 e/r/sgid=25
pflags
Выводит флаги трассировки, сигналы задержки и прочую информацию из каталога /proc для заданного процесса:
# pflags 962 962: /usr/lib/sendmail -Ac -q15m data model = _ILP32 flags = ORPHAN|MSACCT|MSFORK /1: flags = ASLEEP pause()
pldd
Выводит слинкованные библиотеки для заданного процесса (в Solaris 10 у этой команды отсутствует ключ -l, который позволяет вывести unresolved библиотеки, а так же отличается список слинкованных библиотек для одного и того же приложения):
# pldd -l 962 962: /usr/lib/sendmail -Ac -q15m /lib/libumem.so.1 /lib/libc.so.1 /lib/libresolv.so.2 /lib/libnsl.so.1 /lib/libsocket.so.1 /lib/libmd.so.1 /lib/libssl.so.1.0.0 /lib/libcrypto.so.1.0.0
pmap
Выводит информацию об адресном пространстве процесса (карта процесса)
# pmap 962 962: /usr/lib/sendmail -Ac -q15m 08037000 68K rw--- [ stack ] 08050000 904K r-x-- /usr/lib/sendmail 08142000 12K rw--- /usr/lib/sendmail 08145000 636K rw--- [ heap ] FE390000 96K r-x-- /lib/libumem.so.1 FE3B8000 20K rw--- /lib/libumem.so.1 FE3BD000 24K rw--- /lib/libumem.so.1 FE3D0000 436K r-x-- /lib/libnsl.so.1 FE44D000 8K rw--- /lib/libnsl.so.1 FE44F000 20K rw--- /lib/libnsl.so.1 FEAC5000 4K rwxs- [ anon ] FEAD0000 1228K r-x-- /lib/libcrypto.so.1.0.0 FEC13000 76K rw--- /lib/libcrypto.so.1.0.0 FEC26000 8K rw--- /lib/libcrypto.so.1.0.0 FEC30000 4K rw--- [ anon ] FEC40000 284K r-x-- /lib/libssl.so.1.0.0 FEC97000 16K rw--- /lib/libssl.so.1.0.0 FECA0000 4K r--s- dev:536,1 ino:562971607 FECB0000 64K rwx-- [ anon ] FECD0000 64K rwx-- [ anon ] FECF0000 64K r-x-- /lib/libmd.so.1 FED00000 4K rw--- /lib/libmd.so.1 FED10000 4K rw--- [ anon ] FED20000 64K rwx-- [ anon ] FED40000 24K rwx-- [ anon ] FED50000 56K r-x-- /lib/libsocket.so.1 FED6E000 4K rw--- /lib/libsocket.so.1 FED70000 4K rw--- [ anon ] FED80000 4K rw--- [ anon ] FED90000 300K r-x-- /lib/libresolv.so.2 FEDEB000 4K rw--- /lib/libresolv.so.2 FEDEC000 4K rw--- /lib/libresolv.so.2 FEDF0000 1352K r-x-- /usr/lib/libc/libc_hwcap1.so.1 FEF52000 44K rwx-- /usr/lib/libc/libc_hwcap1.so.1 FEF5D000 4K rwx-- /usr/lib/libc/libc_hwcap1.so.1 FEF60000 4K rw--- [ anon ] FEF70000 4K r--s- /var/ld/ld.config FEF80000 4K rw--- [ anon ] FEF90000 4K rw--- [ anon ] FEFA0000 4K rw--- [ anon ] FEFB0000 4K rw--- [ anon ] FEFB7000 208K r-x-- /lib/ld.so.1 FEFFB000 8K rwx-- /lib/ld.so.1 FEFFD000 4K rwx-- /lib/ld.so.1 total 6156K
psig
Выводит информацию о том, на какие сигналы реагирует процесс и как именно (в Solaris 10 список сигналов меньше).
962: /usr/lib/sendmail -Ac -q15m HUP caught runners_sighup RESTART,SIGINFO INT ignored QUIT ignored ILL default TRAP default ABRT default EMT default FPE default KILL default BUS default SEGV default SYS default PIPE ignored ALRM caught sm_tick RESTART,SIGINFO TERM caught runners_sigterm RESTART,SIGINFO USR1 caught sigusr1 RESTART,SIGINFO USR2 default CLD caught reapchild RESTART,SIGINFO ...
pstack
Выводит трассировку стека процесса (в Solaris 10 вместо _start вывелось ?????? = может просто проблема именно в этом процессе)
# pstack 962 962: /usr/lib/sendmail -Ac -q15m feeb82c5 pause () 08086908 main (3, 8047dc8, 8047dd8, 8047dbc) + 4220 08061d2d _start (3, 8047e8c, 0, 8047ea2, 0, 8047ea8) + 7d
ptime
Команда аналогичная time (но с использованием микросостояния учета воспроизводимых точности, в отличии от time потомки команды не учитываются), но при использовании параметра ‘-p’ получаем моментальный снимок использования ресурсов (в Solaris 10 нету параметра -p)
# ptime -p 962 real 123:13:34.069463321 user 0.110260335 sys 0.270589948
При использовании параметра ‘-m’ получаем более полную картину.
ptree
команда аналогичная известной утилите pstree (показывает дерево процессов)
# ptree 997 997 screen 998 /usr/bin/bash 1019 sudo -s 1020 /usr/bin/bash 2544 ptree 997 1057 /usr/bin/bash 2519 man pfiles 2526 /usr/bin/less -ins /tmp/mpIga46e 2175 /usr/bin/bash 2181 sudo -s 2182 /usr/bin/bash 2498 /usr/bin/bash 2500 man pmap 2507 /usr/bin/less -ins /tmp/mpg4aG4e
pwait
Ждёт завершения процесса и выводит его статус. Полезно при использовании скриптов, когда нужно дождаться завершение процесса и проанализировать.
pwdx
Показывает текущую рабочую папку процесса
# pwdx 962 962: /var/spool/clientmqueue
pargs
Показывает аргументы, в которыми запущен процесс
# pargs 962 962: /usr/lib/sendmail -Ac -q15m argv[0]: sendmail: Queue runner@00:15:00 for /var/spool/clientmqueue argv[1]: <NULL> argv[2]: @00:15:00 for /var/spool/clientmqueue
preap
Команда поиска и убийства зомби процессов. Принимает список pid’ов, среди которых ищет зомби и убивает их
ppgsz
The ppgsz utility sets the preferred page size for stack, heap, and/or other anonymous segments for the target process(es), that is, the launched cmd or the process(es) in the pid list. ppgsz stops the target process(es) while changing the page size. See memcntl(2).
Послесловие.
Очень неплохой подбор применений данным утилитам описан так же здесь