У меня есть задание cron, которое запускает сценарий оболочки, который выполняет сценарий php. Он запускается каждый день, отправляет электронное письмо и записывает в stdout (который перенаправляется в файл журнала в сценарии оболочки).
Похоже, что этот процесс сегодня завершился, но не завершился (или как бы там ни было в правильной терминологии). есть!).
$ 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
Он застрял, делая что-то, учитывая, что вы сказали, что он прочитал (4, ...
на выходе в прямом направлении, я бы сказал, что он, вероятно, ждет, когда другой конец гнездового соединения отправит ему данные. Как будто веб-сайт перестал посылать вам данные.
Это полная догадка.
Почти наверняка должен быть файловый дескриптор для 4, который даст больше информации, если вы попробуете lsof -p10756
и посмотрите, что там.