Назад | Перейти на главную страницу

Почему этот процесс не завершается?

У меня есть задание cron, которое запускает сценарий оболочки, который выполняет сценарий php. Он запускается каждый день, отправляет электронное письмо и записывает в стандартный вывод (который перенаправляется в файл журнала в сценарии оболочки).

Похоже, что сегодня этот процесс завершился, но еще не завершен (или какова правильная терминология!).

$ ps -ejH
...
10756 10756 10756 ?        00:00:00   sh
10760 10756 10756 ?        00:00:00     automail.sh
10766 10756 10756 ?        00:03:57       php
...

Процесс с идентификатором 10766 потребляет чуть менее 4 минут процессорного времени. Из интерактивной верхней сессии я получаю следующее:

10766 root      20   0 40640 6024    4 S  0.0  0.2   3:57.48 php

Эти сотые не изменились с тех пор, как я посмотрел на них. Итак, я пришел к выводу, что он почти ничего не делает.

$ ls -ld /proc/10766/
dr-xr-xr-x 7 root root 0 2016-03-09 08:55 /proc/10766/

говорит мне, что это продолжается уже некоторое время; время сервера сейчас:

$ date
Wed Mar  9 11:08:29 GMT 2016

Последняя строка php-скрипта записывается в файл журнала, и эта строка является присутствует в файле журнала. Выполнение скрипта php - это последнее, что происходит в скрипте оболочки.

Как мне определить, почему этот процесс не прекратился?

ОБНОВИТЬ

Вот отредактированная версия сценария оболочки, который я запускаю:

#!/bin/sh

DATE=$(date +%Y-%m-%d)
PHP=/usr/bin/php
SCRIPT=/path/to/script.php
LOG=/path/to/log.file.$DATE.log

$PHP $SCRIPT >> $LOG

Процесс отображается как «спящий» незавершенный или зомбированный.

10766 root      20   0 40640 6024    4 S  0.0  0.2   3:57.48 php

Он застрял, что-то делает, учитывая, что вы сказали, что read(4, ... в выводе strace я бы сказал, что он, вероятно, ждет, пока другой конец сокет-соединения отправит ему данные. Как будто веб-сайт отказался от отправки вам данных.

Это всего лишь предположение.

Почти наверняка должен быть файловый дескриптор для 4, который даст больше информации, если вы попробуете lsof -p10756 и посмотрим, что у него на уме.