Европейский Университет в Санкт-Петербурге
Опубликован: 10.10.2005 | Доступ: свободный | Студентов: 1726 / 299 | Оценка: 4.30 / 3.85 | Длительность: 16:22:00
ISBN: 978-5-94774-820-8
Лекция 7:

Управление процессами

Управление процессами

Команды наблюдения за процессами

Для просмотра текущего списка и состояния процессов следует использовать программу ps. Она выдает "мгновенный снимок" таблицы процессов, которые запущены в системе.

Программа ps без аргументов сообщает список процессов, запущенных пользователем в текущей сессии. Обычно системного администратора интересуют все запущенные в системе процессы, список которых можно узнать по команде

ps -ef

В системах BSD и System V программа ps имеет разные ключи, поэтому если вы переходите от одной системы к другой, надо помнить об этих различиях или обращаться к man ps.

Разберем подробнее, какую информацию выдает программа ps:

ps -ef | more
UID	PID	PPID	C	STIME	TTY	TIME	CMD
root	0	0	0	17:43:30	?	0:03	sched
root	1	0	0	17:43:30	?	0:00	/etc/init -s
root	2	0	0	17:43:30	?	0:00	pageout
root	3	0	0	17:43:30	?	0:00	fsflush
root	349	1	0	17:43:53	?	0:00	/usr/lib/saf/sac -t 300
root	277	276	0	17:43:49	?	0:00	htt_server -port 9010 -syslog -message_locale C
root	180	1	0	17:43:45	?	0:00	/usr/lib/autofs/automountd
root	59	1	0	17:43:39	?	0:00	/usr/lib/sysevent/syseventd
root	73	1	0	17:43:40	?	0:00	/usr/lib/picl/picld
root	133	1	0	17:43:43	?	0:00	/usr/sbin/rpcbind
root	229	1	0	17:43:48	?	0:00	/usr/lib/power/powerd
root	172	1	0	17:43:44	?	0:00	/usr/lib/nfs/lockd
root	156	1	0	17:43:44	?	0:00	/usr/sbin/inetd -s
root	217	1	0	17:43:47	?	0:00	/usr/lib/lpsched
daemon	168	1	0	17:43:44	?	0:00	/usr/lib/nfs/statd
root	189	1	0	17:43:45	?	0:00	/usr/sbin/syslogd
root	203	1	0	17:43:46	?	0:00	/usr/sbin/cron
root	205	1	0	17:43:46	?	0:00	/usr/sbin/nscd
root	343	1	0	17:43:53	?	0:00	/usr/sbin/vold
root	240	1	0	17:43:48	?	0:00	/usr/lib/utmpd
root	324	1	0	17:43:51	?	0:00	/usr/lib/snmp/snmpdx -y -c /etc/snmp/conf
root	261	1	0	17:43:49	?	0:00	/usr/sadm/lib/smc/bin/smcboot
root	355	329	0	17:43:56	?	0:00	/usr/dt/bin/dtlogin -daemon
root	329	1	0	17:43:52	?	0:00	/usr/dt/bin/dtlogin -daemon
root	262	261	0	17:43:49	?	0:00	/usr/sadm/lib/smc/bin/smcboot
root	263	261	0	17:43:49	?	0:00	/usr/sadm/lib/smc/bin/smcboot
root	354	1	0	17:43:55	?	0:00	/usr/lib/ssh/sshd
root	338	1	0	17:43:52	?	0:00	/usr/lib/dmi/snmpXdmid -s sunny
root	352	349	0	17:43:53	?	0:00	/usr/lib/saf/ttymon
root	353	329	2	17:43:54	?	1:41	/usr/openwin/bin/Xsun :0 -nobanner -auth /var/dt/A:0-KtaiPa
root	356	329	0	17:43:56	?	0:00	/usr/openwin/bin/fbconsole -d :0
root	358	324	0	17:43:57	?	0:00	mibiisa -r -p 5248
root	337	1	0	17:43:52	?	0:00	/usr/lib/dmi/dmispd
Пример 7.4. Результат работы программы ps

Ниже мы описываем смысл колонок этого вывода. Некоторые колонки появятся только при использовании специфических ключей, отличных от ключей ef. Для получения еще более детальной информации следует обратиться к man ps.

UID - эффективный идентификатор владельца процесса (реальный выводится при использовании ключа -f ).

В колонке F - flags (флаги) - выводятся флаги процесса, это устаревшее поле, сохраненное для совместимости.

В колонке S - state (состояние) - указывается состояние процесса. Состояния бывают следующие:

  • O (ON PROC) - процесс находится в процессоре и выполняется;
  • S (Sleeping) - процесс ждет завершения события (например, ввода-вывода);
  • R (Runnable) - процесс готов к выполнению и ждет своего кванта в очереди к процессору;
  • Z (Zombie) - процесс стал <зомби>, так как завершился, а родительский процесс не подождал его завершения;
  • T (sTopped) - процесс остановлен по сигналу остановки или в процессе трассировки.

Идентификатор PID - уникальный идентификатор процесса, используется при передаче ему сигналов.

PPID - идентификатор родительского процесса.

C - загрузка процессора на планирование задачи (устарело, выводится для совместимости).

CLS - класс планирования.

PRI - приоритет процесса ; когда указан ключ , бо'льшие значения означают больший приоритет, без ключа бо'льшие значения означают меньший приоритет.

NI - значение NICE (показателя уступчивости), используется при вычислении глобального приоритета процессов в классе разделения времени.

ADDR - адрес в памяти.

SZ - размер процесса в виртуальной памяти, включая все отображенные файлы и устройства, измеряется в страницах памяти, для получения размера в килобайтах в большинстве случаев это значение надо умножить на 4, точнее - см. команду pagesize.

WCHAN - адрес события, ради которого процесс перешел в состояние сна; если поле пусто, процесс запущен.

STIME - время запуска процесса, в часах, минутах и секундах, для запущенных более суток назад процессов указываются месяцы и дни.

TTY - управляющий терминал (то же, что и терминальная группа), символ вопросительного знака "?" печатается для процесса без управляющего терминала.

TIME - число минут и секунд, указывающее, сколько времени процесс отнял у процессора.

CMD - команда, которой был запущен процесс.

При указании ключа j выводятся дополнительные сведения:

PGID - идентификатор лидера группы процессов.

SID - идентификатор процесса - лидера сессии.

При указании ключа L выводятся дополнительные сведения, причем информация выдается по одной строке на каждый легковесный процесс, обычные однопоточные процессы соотносятся только с одним легковесным процессом:

LWP - идентификатор легковесного процесса.

NLWP - число легковесных процессов для процесса.

Завершившиеся процессы, код завершения которых не был востребован родительским процессом, помечаются как "defunct".

Кроме программы ps в UNIX для получения информации о запущенных в данный момент процессах широко используется команда top:

top
last pid: 923; load averages: 4.56, 1.18, 0.50    17:54:22
64 processes: 63 sleeping, 1 on cpu
CPU states: 0.0% idle, 0.5% user, 99.5% kernel, 0.0% iowait, 0.0% swap
Memory: 128M real, 18M free, 101M swap in use, 499M swap free

PID	USERNAME	LWP	PRI	NICE	SIZE	RES	STATE	TIME	CPU 	COMMAND
909	root 		1 	60 	0 	17M 	3340K 	sleep 	0:00 	0.92% 	pagein
353	root		1	58	0	32M	16M	sleep	0:05	0.37% 	Xsun
893	root 		1	49	0	2228K	1172K	cpu	0:00	0.15%	top
753	root 		1 	49	0 	15M 	8112K 	sleep  	0:00 	0.13% 	dtterm
911	root 		1 	59	0 	3352K 	752K 	sleep  	0:00 	0.03% 	sh
912	root 		1 	49	0 	3360K 	600K 	sleep  	0:00 	0.03% 	sh
894	root 		1 	59	0 	3064K 	1816K 	sleep  	0:00 	0.03% 	dtexec
656	root 		5 	59	0 	22M  	10M 	sleep  	0:01 	0.02% 	dtwm
648	root 		1 	59	0 	6644K 	2280K 	sleep  	0:00 	0.02% 	ttsession
667	root 		1 	59	0 	1844K 	512K 	sleep  	0:00 	0.02% 	rpc.rstatd
277	root 		29	59	0 	5612K 	1724K 	sleep  	0:00 	0.01% 	htt_server
895	root 		1 	59	0 	3360K 	756K 	sleep  	0:00 	0.01% 	soffice
720	root 		4 	49	0 	42M  	26M 	sleep  	0:03 	0.00% 	mozilla-bin
649	root 		1 	49	0 	18M 	6288K 	sleep  	0:00 	0.00% 	dtsession
760	root 		1 	49	0 	4752K 	1656K 	sleep  	0:00 	0.00% 	bash
Пример 7.5. Результат работы команды top

В Solaris для удобства получения информации о процессах с определенными именами есть команда

pgrep имя

Она является эквивалентом команды

ps -ef | grep имя

С помощью pargs можно посмотреть, какие аргументы переданы конкретному процессу и какая у него среда окружения:

pargs 2793
2793:  dtterm -name Run -xrm *menuBar: False -iconic -map 
-e /usr/dt/bin/dtexec -open 
argv[0]: dtterm
argv[1]: -e
argv[2]: /usr/dt/bin/dtexec
argv[3]: -open
argv[4]: -1
argv[5]: -ttprocid
argv[6]: 2.10fX-r 01 648 1289637086 1 1 0 192.168.5.33 5 
sunny_105_1
argv[7]: /export/home/mozilla_bin/sfw/bin/mozilla
argv[8]: <NULL>
argv[9]: -open
argv[10]: -1
argv[11]: -ttprocid
argv[12]: 2.10fX-r 01 648 1289637086 1 1 0 192.168.5.33 5 
sunny_105_1
argv[13]: /export/home/mozilla_bin/sfw/bin/mozilla

pargs -e 2793
2793:  dtterm -name Run -xrm *menuBar: False -iconic -map -e /usr/dt/bin/dtexec -open 
envp[0]: AB_CARDCATALOG=/usr/dt/share/answerbooks/ru_RU.UTF-8/ab_cardcatalog
envp[1]: DISPLAY=:0.0
envp[2]: DTAPPSEARCHPATH=//.dt/appmanager:/etc/dt/appconfig/appmanager/%L:/etc/dt/appconfig/appmanager/C:/usr/dt/appconfig/appmanager/%L:/usr/dt/appconfig/appmanager/C
envp[3]: DTDATABASESEARCHPATH=//.dt/types,/etc/dt/appconfig/types/%L,/etc/dt/appconfig/types/C,/usr/dt/appconfig/types/%L,/usr/dt/appconfig/types/C
Пример 7.6. Результат работы программы pargs

Вывод команды pargs значительно сокращен, ключ -e требует вывести все содержимое среды окружения, а для графических программ типа dtterm, как в нашем примере, среда окружения весьма велика.

Команда prstat позволяет в динамике, подобно команде top, отслеживать состояние процессов:

prstat
PID	USERNAME	SIZE	RSS	STATE	PRI	NICE	TIME	CPU	PROCESS/NLWP
3576	root	3412K	868K	run	13	0	0:00:02	6,3%	find/1
353	root	45M	19M	sleep	59	0	0:02:30	0,2%	Xsun/1
753	root	15M	3620K	run	49	0	0:00:02	0,1%	dtterm/1
3577	root	6640K	4108K	cpu0	49	0	0:00:00	0,1%	prstat/1
205	root	2872K	624K	sleep	59	0	0:00:00	0,0%	nscd/18
895	root	123M	21M	sleep	49	0	0:00:49	0,0%	soffice.bin/4
667	root	1844K	488K	sleep	59	0	0:00:00	0,0%	rpc.rstatd/1
217	root	5364K	536K	sleep	59	0	0:00:00	0,0%	lpsched/1
324	root	4360K	196K	sleep	59	0	0:00:00	0,0%	snmpdx/1
240	root	1100K	288K	sleep	59	0	0:00:00	0,0%	utmpd/1
343	root	4892K	0K	sleep	59	0	0:00:00	0,0%	vold/3
276	root	3240K	0K	sleep	59	0	0:00:00	0,0% 	htt/1
633	root	3784K	0K	sleep	59	0	0:00:00 	0,0% 	sdt_shell/1
657	root	16M	2496K	sleep	49	0	0:00:00 	0,0% 	dtfile/1
203	root	4484K	568K	sleep	59	0	0:00:00 	0,0% 	cron/1
189	root	5636K	1092K	sleep	59	0	0:00:00 	0,0% 	syslogd/13
168	daemon	2444K	820K	sleep	59	0	0:00:00 	0,0% 	statd/1
156	root 	2412K	688K	sleep	59	0 	0:00:00 	0,0% 	inetd/1
172	root 	2160K	748K	sleep	59	0	0:00:00 	0,0% 	lockd/2
229	root 	1348K	0K	sleep	59	0	0:00:00 	0,0% 	powerd/2
133	root 	2212K	604K	sleep	59	0	0:00:00 	0,0% 	rpcbind/1
Total: 61 processes, 161 lwps, load averages: 0,25, 0,17, 0,27
Пример 7.7. Результат работы программы prstat

Вы можете получить информацию только о тех процессах, которые запущены вами. Пользователю root доступна информация о любых процессах.

Процессы-зомби

В Solaris 9 появилась новая программа preap, которая позволяет убрать из системы "мнимые" (defunct), не до конца завершившиеся процессы, которые также носят название "зомби" (zombie). Эти процессы совершенно безобидны, так как это - самые обыкновенные процессы, код завершения которых не был принят родительскими процессами (например, в результате преждевременного завершения родительского процесса или иного сбоя). Несмотря на безобидность, они могут попусту занимать ресурсы системы, если таких процессов будет много. Обычно процессы-зомби автоматически уничтожаются процессом init, но если этого почему-либо не произошло, можно воспользоваться программой preap, которая примет код завершения процесса-зомби и даст ему упокоиться с миром.