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

*/ * * * * 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. c#,条码

    static void Generate2(string text){ BarcodeWriter writer = new BarcodeWriter(); //使用ITF 格式,不能被现在常用的支 ...

  2. MS SQL 2000 分配权限

    /** 分配权限 **/ use [master]create login [ln-tf\liaobin] from windows;gogrant control server to [ln-tf\ ...

  3. 几组不错的X264自定义编码<转>

    转帖地址:http://tieba.baidu.com/p/4201033507 一般直播时使用A设定即可.你尝试设置并找出你最满意的设定 A为最需最低CPU资源,E为最高. A8x8dct=1 aq ...

  4. LUA 表排序

    t = { [] = , [] = , [] = } for k, v in pairs(t) do--注意这个输出顺序是没有规律的!!! print(k, v) end local keys = { ...

  5. JAVA程序中使用正则表达式

    import java.util.regex.Matcher;import java.util.regex.Pattern; /** * @author Administrator 测试正则表达式 * ...

  6. 安装 ORACLE 11G出现Error Message:PRVF-7535

    Error Message:PRVF-7535 : Proper architectureis not found on node "tsing" [Expected = &quo ...

  7. 将Oracle数据库设置为归档模式及非归档模式

    一.将Oracle数据库设置为归档模式 1)sql>shutdown normal/immediate;2)sql>startup mount;3)sql>alter databas ...

  8. golang之map数据类型

    先上代码…… package main import "fmt" func testMap() { //两种声明map方式,切记,必须初始化才能用,否则panic //var a ...

  9. Golang之fmt格式“占位符”

    golang的fmt包实现了格式化I/O函数: package main import "fmt" type Human struct { Name string } func m ...

  10. asp.net 自定义节配置 (configSections下的section)

    <configuration> <configSections> <!--.自定义一个节 CustomSection --> <section name=&q ...