这个过程为何拒绝退出?

这个过程为何拒绝退出?

我有一个 cron 作业,它运行一个执行 php 脚本的 shell 脚本。它每天运行,发送一些电子邮件,并写入 stdout(重定向到 shell 脚本中的日志文件)。

今天,看起来这个过程已经完成了,但还没有退出(或者无论正确的术语是什么!)。

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

id 为的进程10766已消耗了将近 4 分钟的 CPU 时间。从交互式 top 会话中,我得到以下信息:

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 脚本是 shell 脚本中的最后一件事。

我该如何诊断为什么这个过程还没有退出?

更新

下面是我正在运行的 shell 脚本的编辑版本:

#!/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

答案1

该进程被列为“休眠”状态,未完成或处于僵尸状态。

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

它卡在了某件事上,鉴于你说它read(4, ...在 strace 输出中,我认为它可能在等待套接字连接的另一端向其发送数据。就像一个网站放弃向您发送数据一样。

但这完全只是猜测。

几乎肯定应该有一个 4 的文件描述符,如果您尝试lsof -p10756查看它在做什么,它会提供更多信息。

相关内容