我有一个 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
查看它在做什么,它会提供更多信息。