公司所用计划任务均是大概这样子的:

*/ * * * * root cd /opt/xxxx/test_S1/html/xxxx/admin; php index.php task testOne >/dev/null >&
*/ * * * * root cd /opt/xxxx/test_S1/html/xxxx/admin; php index.php task testTwo >/dev/null >&

可以看到把输出与标准错误进行重定向到空设备了,这样做是有一定原因的。查阅了一些资料,在这里描述一下:

1.ssh登陆服务器
2.新建一个php文件test.php,代码如下:

<?php
sleep();
echo "aaa\n";
file_put_contents("/tmp/test.txt",time());
?>

3.用以下命令执行test.php程序

$ php test.php &

查看 /tmp/test.txt 文件的内容为1497613738

4.然后再次执行如下命令。命令执行后,马上使用exit命令退出登陆

$ php test.php &

5 然后ssh登陆服务器,发现/tmp/test.txt 文件的内容依然是 1497613738。说明第二次执行test.php时,file_put_contents函数没有执行,或者没有执行成功。

6 使用strace进行追踪:

正常情况下的追踪:
strace -p 1475
结果:
Process  attached
restart_syscall(<... resuming interrupted call ...>) =
write(, "aaa\n", 4aaa
) =
lstat("/tmp/test.txt", 0x7ffe792ebe90) = - ENOENT (No such file or directory)
lstat("/tmp", {st_mode=S_IFDIR|S_ISVTX|, st_size=, ...}) =
open("/tmp/test.txt", O_WRONLY|O_CREAT|O_TRUNC, ) =
fstat(, {st_mode=S_IFREG|, st_size=, ...}) =
lseek(, , SEEK_CUR) =
write(, "", ) =
close() =
munmap(0x7f4840239000, ) =
close() =
close() =
munmap(0x7f4847510000, ) =
close() =
munmap(0x7f4847511000, ) =
sched_getaffinity(, , {ffffff, , , , , , , , , , , , , , , }) =
sched_setaffinity(, , {ffffff, , , , , , , , , , , , , , , }) =
munmap(0x7f48404c8000, ) =
munmap(0x7f48406ce000, ) =
munmap(0x7f4840b39000, ) =
munmap(0x7f484090b000, ) =
munmap(0x7f4840d49000, ) =
exit_group() = ?
+++ exited with +++
[]+ Done php test.php

退出后再登陆的追踪:

strace -p 3881

restart_syscall(<... resuming interrupted call ...>) =
write(, "aaa\n", ) = - EIO (Input/output error)
munmap(0x7f6b7fc04000, ) =
close() =
close() =
munmap(0x7f6b86edb000, ) =
close() =
munmap(0x7f6b86edc000, ) =
sched_getaffinity(, , {ffffff, , , , , , , , , , , , , , , }) =
sched_setaffinity(, , {ffffff, , , , , , , , , , , , , , , }) =
munmap(0x7f6b7fe93000, ) =
munmap(0x7f6b80099000, ) =
munmap(0x7f6b80504000, ) =
munmap(0x7f6b802d6000, ) =
munmap(0x7f6b80714000, ) =
exit_group() = ?
+++ exited with +++

通过对比可以看到echo处出现了 输入/输出错误,最终没有执行file_put_contents函数。

7 原因:

为什么退出登陆后,再登陆,就会发生EIO错误呢?这个和linux的会话处理有关。
当用户ssh登陆一个服务器时,也就开始了一个会话。会话开始后,标准输入(stdin)、标准输出(stdout)、标准错误(stderr)会连接到一个对应的终端(pty)。
用户登陆后,任何标准输出都会在终端中有反应。标准输出的文件句柄是1。因此,php中的echo("aaa\n") 会导致执行系统调用write(1, "aaa\n", 4). 会在终端中写aaa\n。
​当用户退出登陆时,一个会话就结束了。会话结束时,修改所有打开该终端的文件句柄,改成不可读也不可写;
​用户退出登陆后再执行write(1, "aaa\n", 4),会报EIO错误。因为终端句柄已经不可写。EIO错误发生后,导致进程结束。

解决办法
方法一:
​使用重定向符号&把标准输出重定向到空洞。

$ php test.php > /dev/null  >& &   这里的& 可以用也可以不用

方法二:
使用nohup。

$ nohup php test.php &

说明:

如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。

该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup就是不挂起的意思( n ohang up)。

而我们公司采用的是第一种方法,关于对/dev/null 2 >&1 & 的描述,看另外一篇文章http://www.cnblogs.com/zhenghongxin/p/7029173.html

谈一谈PHP计划任务的更多相关文章

  1. 谈一谈Java8的函数式编程(二) --Java8中的流

    流与集合    众所周知,日常开发与操作中涉及到集合的操作相当频繁,而java中对于集合的操作又是相当麻烦.这里你可能就有疑问了,我感觉平常开发的时候操作集合时不麻烦呀?那下面我们从一个例子说起. 计 ...

  2. 谈一谈泛型(Generic)

    谈一谈泛型 首先,泛型是C#2出现的.这也是C#2一个重要的新特性.泛型的好处之一就是在编译时执行更多的检查. 泛型类型和类型参数 ​ 泛型的两种形式:泛型类型( 包括类.接口.委托和结构 没有泛型枚 ...

  3. 从一张图开始,谈一谈.NET Core和前后端技术的演进之路

    从一张图开始,谈一谈.NET Core和前后端技术的演进之路 邹溪源,李文强,来自长沙.NET技术社区 一张图 2019年3月10日,在长沙.NET 技术社区组织的技术沙龙<.NET Core和 ...

  4. 谈一谈Elasticsearch的集群部署

      Elasticsearch天生就支持分布式部署,通过集群部署可以提高系统的可用性.本文重点谈一谈Elasticsearch的集群节点相关问题,搞清楚这些是进行Elasticsearch集群部署和拓 ...

  5. 谈一谈iOS事件的产生和传递

    谈一谈iOS事件的产生和传递 1.事件的产生 发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中. UIApplication会从事件队列中取出最前面的事件,并将事件 ...

  6. 谈一谈对MySQL InnoDB的认识及数据库事物处理的隔离级别

    介绍: InnoDB引擎是MySQL数据库的一个重要的存储引擎,和其他存储引擎相比,InnoDB引擎的优点是支持兼容ACID的事务(类似于PostgreSQL),以及参数完整性(有外键)等.现在Inn ...

  7. 谈一谈APP版本号问题

    如题:谈一谈APP版本号问题 为什么要谈这个问题,周五晚上11~12点,被微信点名,说APP有错,无效的版本号,商城无法下单.我正在准备收拾东西,周末回老家,结果看到这样问题,菊花一紧.我擦,我刚加的 ...

  8. 谈一谈深度学习之semantic Segmentation

    上一次发博客已经是9月份的事了....这段时间公司的事实在是多,有写博客的时间都拿去看paper了..正好春节回来写点东西,也正好对这段时间做一个总结. 首先当然还是好好说点这段时间的主要工作:语义分 ...

  9. 蓝的成长记——追逐DBA(5):不谈技术谈业务,恼人的应用系统

    ***************************************声明*************************************** 个人在oracle路上的成长记录,当中 ...

  10. 谈一谈并查集QAQ(上)

    最近几日理了理学过的很多oi知识...发现不知不觉就有很多的知识忘记了... 在聊聊并查集的时候顺便当作巩固吧.... 什么是并查集呢? ( Union Find Set ) 是一种用于处理分离集合的 ...

随机推荐

  1. 少走弯路,给Java 1~5 年程序员的建议

    参考:https://www.jianshu.com/p/5681a1f0aad6 今天LZ是打算来点干货,因此咱们就不说一些学习方法和技巧了,直接来谈每个阶段要学习的内容甚至是一些书籍.这一部分的内 ...

  2. 最全互联网Linux工作规划!

    首先祝贺你选择学习Linux,你可能即将踏上Linux的工作之旅,出发之前,让我带你来看一看关于Linux和Linux运维的一切. Linux因其高效率.易于裁剪.应用广等优势,成为了当今中高端服务器 ...

  3. 跨域资源共享/option 请求产生原因

    https://blog.csdn.net/hfahe/article/details/7730944

  4. xdebug php

    sudo apt-get install php5-dev php5-cli #其中php5-dev为了安装xdebug所以必须安装. sudo apt-get install php5-xsl #X ...

  5. Excel VBA入门(八)单元格边框

    本文基于以下文件 http://pan.baidu.com/s/1nvJtsu9 (部分)内容预览: 1. 边框样式 Sub cell_format() Dim sht As Worksheet Di ...

  6. 关于Url传递参数

    Url传递参数时,后台取值会直接取等号后面的内容,包括引号在内. 比如:   http://localhost:8080/user?name='admin' 这是错误的做法,后台获取到的参数是包括引号 ...

  7. 搭建简单的Spring框架

    1.Spring框架相关jar包下载地址http://repo.springsource.org/libs-release-local/org/springframework/spring,复制,进入 ...

  8. [udemy]WebDevelopment_CSS

    Your First CSS(Cascading Style Sheets) Cascading means it always takes selector that is at the end 即 ...

  9. 深入浅出谈数据挖掘zz

    编者的话:本文对数据挖掘概念的产生,数据挖掘与常规数据分析的主要区别,所能解决的几大类问题和所应用的领域都有着非常清晰的论述.作者在此篇文章中认为数据挖掘最重要的要素是分析人员的相关业务知识和思维模式 ...

  10. centos环境下创建数据库和表的方法

    centos环境下创建数据库和表的方法 //查询数据库的命令: mysql> SHOW DATABASES; +--------------------+ | Database         ...