У меня есть задание 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
и посмотрим, что у него на уме.