【发布时间】:2019-05-22 16:27:53
【问题描述】:
我有生产脚本,可以将文件从一个已挂载的网络共享复制并重命名到另一个(都是 CIFS),有时copy 函数在读取 I/O 时无限期挂起,使进程进入不间断睡眠,只能被杀死SIGKILL.(谢天谢地,显然是 TASK_KILLABLE。)
由于操作在copy 调用时被阻止,我无法优雅地处理 I/O 故障,更重要的是,也无法记录它。
$res = copy("/path/to/mount/file.pdf", "/path/to/productionqueue/newfile.pdf");
//This doesn't run because of the process state.
if($res) {
//Report success to the log.
} else {
//Report failure to the log.
}
这是一个环境,特定于文件的问题,手动干预可以修复它,但我需要记录故障,以便通知管理员有关情况。 (顺便说一句:我认为这是一个锁竞争条件。我可以通过卸载和重新安装源共享来解决问题,但重现它有点问题。)
理想情况下,我希望 copy 调用在 10 秒后超时,这样我可以记录错误,但 PHP 中似乎没有办法做到这一点。
我正在考虑将复制或读取操作委托给由timeout 命令监控的子进程并根据退出代码进行响应,但是 PHP 脚本中有更简单的方法来处理这种情况吗?
我在搜索中找到的所有内容都表明只有运行时配置可用于套接字/网络超时,而不是文件系统调用。
【问题讨论】: