Отслеживание системных вызовов

Когда вам нужно узнать, что делает процесс, вы можете отслеживать все системные вызовы процесса с помощью команды strace.

  1. Запустив команду php start.php status, вы можете увидеть информацию о процессах, связанных с Workerman, следующим образом:
Привет, администратор
---------------------------------------ГЛОБАЛЬНЫЙ СТАТУС--------------------------------------------
Версия Workerman: 3.0.1
время запуска: 2014-08-12 17:42:04, работает 0 дней 1 час
средняя загрузка: 3.34, 3.59, 3.67
1 пользователь        8 рабочих       14 процессов
имя_рабочего       статус_выхода     счетчик_выходов
Бизнес_Воркер      0                0
Чат_Веб            0                0
Монитор_Файлов     0                0
Шлюз              0                0
Монитор           0                0
Провайдер_Статистики 0                0
Веб_Статистики      0                0
Рабочий_Статистики   0                0
---------------------------------------СТАТУС_ПРОЦЕССА-------------------------------------------
pid память      прослушивание        временная_метка  имя_рабочего       всего_запросов ошибка_пакета гром_гонце клиент_закрыть ошибка_отправки бросать_исключение успешно/всего
10352   1.5M    tcp://0.0.0.0:55151  1407836524 Чат_Веб           12             0          0            2            0         0               100%
10354   1.25M   tcp://0.0.0.0:7272   1407836524 Шлюз           3              0          0            0            0         0               100%
10355   1.25M   tcp://0.0.0.0:7272   1407836524 Шлюз           0              0          1            0            0         0               100%
10365   1.25M   tcp://0.0.0.0:55757  1407836524 Веб_Статистики      0              0          0            0            0         0               100%
10358   1.25M   tcp://0.0.0.0:7272   1407836524 Шлюз           3              0          2            0            0         0               100%
10364   1.25M   tcp://0.0.0.0:55858  1407836524 Провайдер_Статистики 0              0          0            0            0         0               100%
10356   1.25M   tcp://0.0.0.0:7272   1407836524 Шлюз           3              0          2            0            0         0               100%
10366   1.25M   udp://0.0.0.0:55656  1407836524 Рабочий_Статистики   55             0          0            0            0         0               100%
10349   1.25M   tcp://127.0.0.1:7373 1407836524 Бизнес_Воркер    5              0          0            0            0         0               100%
10350   1.25M   tcp://127.0.0.1:7373 1407836524 Бизнес_Воркер    0              0          0            0            0         0               100%
10351   1.5M    tcp://127.0.0.1:7373 1407836524 Бизнес_Воркер    5              0          0            0            0         0               100%
10348   1.25M   tcp://127.0.0.1:7373 1407836524 Бизнес_Воркер    2              0          0            0            0         0               100%
  1. Например, если вы хотите узнать, что делает процесс шлюз с pid 10354, вы можете выполнить команду strace -p 10354 (возможно, потребуются права root), аналогично следующему:
sudo strace -p 10354
Процесс 10354 прикреплен - нажмите прервать, чтобы завершить
clock_gettime(CLOCK_MONOTONIC, {118627, 242986712}) = 0
gettimeofday({1407840609, 102439}, NULL) = 0
epoll_wait(3, 985f4f0, 32, -1)          = -1 EINTR (Прерывание системного вызова)
--- SIGUSR2 (Пользовательский сигнал 2) @ 0 (0) ---
send(7, "\f", 1, 0)                     = 1
sigreturn()                             = ? (теперь маска [])
clock_gettime(CLOCK_MONOTONIC, {118627, 699623319}) = 0
gettimeofday({1407840609, 559092}, NULL) = 0
epoll_wait(3, {{EPOLLIN, {u32=9, u64=9}}}, 32, -1) = 1
clock_gettime(CLOCK_MONOTONIC, {118627, 699810499}) = 0
gettimeofday({1407840609, 559277}, NULL) = 0
recv(9, "\f", 1024, 0)                  = 1
recv(9, 0xb60b4880, 1024, 0)            = -1 EAGAIN (Ресурс временно недоступен)
epoll_wait(3, 985f4f0, 32, -1)          = -1 EINTR (Прерывание системного вызова)
--- SIGUSR2 (Пользовательский сигнал 2) @ 0 (0) ---
send(7, "\f", 1, 0)                     = 1
sigreturn()                             = ? (теперь маска [])
clock_gettime(CLOCK_MONOTONIC, {118628, 699497204}) = 0
gettimeofday({1407840610, 558937}, NULL) = 0
epoll_wait(3, {{EPOLLIN, {u32=9, u64=9}}}, 32, -1) = 1
clock_gettime(CLOCK_MONOTONIC, {118628, 699588603}) = 0
gettimeofday({1407840610, 559023}, NULL) = 0
recv(9, "\f", 1024, 0)                  = 1
recv(9, 0xb60b4880, 1024, 0)            = -1 EAGAIN (Ресурс временно недоступен)
epoll_wait(3, 985f4f0, 32, -1)          = -1 EINTR (Прерывание системного вызова)
--- SIGUSR2 (Пользовательский сигнал 2) @ 0 (0) ---
send(7, "\f", 1, 0)                     = 1
sigreturn()                             = ? (теперь маска [])
  1. Каждая строка представляет собой системный вызов, из этой информации легко определить, что делает процесс, застрял ли он и где, застрял ли он в подключении или при считывании сетевых данных и т. д.