谈一谈跑PHP计划任务

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

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

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

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

<?php
sleep(50);
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 1475 attached
restart_syscall(<... resuming interrupted call ...>) = 0
write(1, "aaa\n", 4aaa
)                    = 4
lstat("/tmp/test.txt", 0x7ffe792ebe90)  = -1 ENOENT (No such file or directory)
lstat("/tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=65536, ...}) = 0
open("/tmp/test.txt", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
lseek(3, 0, SEEK_CUR)                   = 0
write(3, "1497614186", 10)              = 10
close(3)                                = 0
munmap(0x7f4840239000, 528384)          = 0
close(2)                                = 0
close(1)                                = 0
munmap(0x7f4847510000, 4096)            = 0
close(0)                                = 0
munmap(0x7f4847511000, 4096)            = 0
sched_getaffinity(1475, 128, {ffffff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}) = 128
sched_setaffinity(0, 128, {ffffff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}) = 0
munmap(0x7f48404c8000, 2119936)         = 0
munmap(0x7f48406ce000, 2345056)         = 0
munmap(0x7f4840b39000, 2162536)         = 0
munmap(0x7f484090b000, 2282472)         = 0
munmap(0x7f4840d49000, 323584)          = 0
exit_group(0)                           = ?
+++ exited with 0 +++
[1]+  Done                    php test.php

退出后再登陆的追踪:

strace -p 3881

restart_syscall(<... resuming interrupted call ...>) = 0
write(1, "aaa\n", 4)                    = -1 EIO (Input/output error)
munmap(0x7f6b7fc04000, 528384)          = 0
close(2)                                = 0
close(1)                                = 0
munmap(0x7f6b86edb000, 4096)            = 0
close(0)                                = 0
munmap(0x7f6b86edc000, 4096)            = 0
sched_getaffinity(3881, 128, {ffffff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}) = 128
sched_setaffinity(0, 128, {ffffff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}) = 0
munmap(0x7f6b7fe93000, 2119936)         = 0
munmap(0x7f6b80099000, 2345056)         = 0
munmap(0x7f6b80504000, 2162536)         = 0
munmap(0x7f6b802d6000, 2282472)         = 0
munmap(0x7f6b80714000, 323584)          = 0
exit_group(0)                           = ?
+++ exited with 0 +++

通过对比可以看到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 2 >&1 &   这里的& 可以用也可以不用

方法二:
使用nohup。

$ nohup php test.php &

说明:

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

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

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

时间: 2024-10-25 13:09:14

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

谈一谈SQL Server中的执行计划缓存(上)

原文:谈一谈SQL Server中的执行计划缓存(上) 简介     我们平时所写的SQL语句本质只是获取数据的逻辑,而不是获取数据的物理路径.当我们写的SQL语句传到SQL Server的时候,查询分析器会将语句依次进行解析(Parse).绑定(Bind).查询优化(Optimization,有时候也被称为简化).执行(Execution).除去执行步骤外,前三个步骤之后就生成了执行计划,也就是SQL Server按照该计划获取物理数据方式,最后执行步骤按照执行计划执行查询从而获得结果.但查询

【dotnet跨平台】谈一谈dotnet-cli开源社区的产品持续集成

?? [dotnet跨平台]谈一谈dotnet-cli开源社区的产品持续集成 进入其中一个PR:https://github.com/dotnet/cli/pull/2580 可以看到微软使用自己搭建的持续集成平台来保证产品和代码的质量,其中每一个即将整合代码到rel/1.0.0这个主分支的代码都要经过7个测试通过,其中2个windows平台,4个linux平台和一个OS X平台如下: Details Windows_NT x64 Release Build - Build finished.

谈一谈商品编码的问题

如题:今天谈一谈商品编码的问题,我们不是完全从物流和商品本身的角度去谈商品该怎么编码才符合国际标准,EAN,UPC啥啥啥怎么样的.我们从计算机程序设计,电商,数据库存储的角度看一看商品编码,首先商品有哪些编码,然后这些编码和商品的关系,在然后这些编码该怎么使用.要从电商的角度了解商品,马上想到的可能是淘宝,天猫,京东,亚马逊等他们的商品是怎么样子,是怎么存储的. 这些这么成熟的电商完全可以参考和借鉴.关于商品这个话题还是太大,因为商品本身设计的东西太多了,不同活动先不同的价格,多规格商品,不同的

谈一谈软件BUG造成的严重危害

写下本文的原因是因为这是老师布置的一个作业,谈一谈自己在实际的软件开发过程中所遇到的.并对自己影响很大的bug.无奈的是,笔者是一个软件开发的初学者,接手过的项目实在有限,在自己编写的有限的代码中所遇到的bug多是由于粗心而引起的语法问题.符号问题.代码格式问题.这些虽然是小问题,但作为一个程序员,这些看似不起眼的“小问题”却可能引起程序不能运行,出错等一系列的“大问题”,所以作为初学者的我也要时刻提醒自己,不断检查,不断完善.在认识了bug的危害性之后,突然让我不禁想起一个有关bug造成恶劣影

谈一谈我最喜欢的诗人--法国诗人波德莱尔

很多时候我都沉醉于波德莱尔的诗集中....... 虽然我没有看过波德莱尔相关的信息,但是看他的诗,却能够让我感受到一颗炽烈的心再向生活中的种种现象作出了自己的反思和歇斯底里的抗议,虽然有点颓废,但是他一直都在努力地避免陷入生活中糟糕的状态,波德莱尔一直都在观察生活,向我们解释了生活中的种种细节方面的信息.波德莱尔似乎是倾向于社会主义的诗人,这一点我在他的诗中能够强烈地感受到这一点,因为他是反对资本主义糜烂的物质生活的.对于当下的我们也是一记警钟.为什么呢?当人陷入物质的海洋中却没有精神信仰的寄托

谈一谈APP版本号问题

如题:谈一谈APP版本号问题 为什么要谈这个问题,周五晚上11~12点,被微信点名,说APP有错,无效的版本号,商城无法下单.我正在准备收拾东西,周末回老家,结果看到这样问题,菊花一紧.我擦,我刚加的版本号检查,在加版本号检查前,我还跟统计的妹妹仔细核对了近半年来所有的版本号,怎么还会有问题.赶紧查,原来结果,看到了一个g1_2.5.5_65,在我的一再追问下说这个就是2.5.5的版本号.然后咱们来说一说为什么要加版本号检查,然后再说,为什么会加出问题来,最后在讨论一下版本号规则.题外话跟大家探

谈一谈几种处理 JavaScript 异步操作的办法

本文标签:   JavaScript 原生JavaScript优势 JavaScript异步 js的异步操作 回调函数 TensorFlow REST   服务器 引言 js的异步操作,已经是一个老生常谈的话题,关于这个话题的文章随便google一下都可以看到一大堆.那么为什么我还要写这篇东西呢?在最近的工作中,为了编写一套相对比较复杂的插件,需要处理各种各样的异步操作.但是为了体积和兼容性,不打算引入任何的pollyfill,甚至连babel也不允许使用,这也意味着只能以es5的方式去处理.使

谈一谈我在阿里的成长

前几天受阿里通信的同事邀请,分享了一个关于成长的话题.其实我不太热衷于分享此类话题,作为一个技术人,分享那些没有技术干货的内容总感觉有些怪怪的.但最后还是拟下了这个话题 ——<谈一谈我在阿里的成长>,所以本文主要是对分享的 PPT 做简述. 可以回首一下,毕业工作后的这段时间里,你做过哪些事情让自己感觉有了很大的成长? 我简单枚举了一下,主要是这几个方面: 涉足一个未知的领域,走进去,那就是成长:能够坚持不懈的完成一件事情,优化一个项目,那也是成长:能够沉淀方案,推广自己的想法,让更多的人收益

谈一谈Elasticsearch的集群部署

??Elasticsearch天生就支持分布式部署,通过集群部署可以提高系统的可用性.本文重点谈一谈Elasticsearch的集群节点相关问题,搞清楚这些是进行Elasticsearch集群部署和拓扑结构设计的前提.关于如何配置集群的配置文件不会在本文中提及. 节点类型 1. 候选主节点(Master-eligible node) ??一个节点启动后,就会使用Zen Discovery机制去寻找集群中的其他节点,并与之建立连接.集群中会从候选主节点中选举出一个主节点,主节点负责创建索引.删除索

谈一谈今年的移动互联网寒冬

转载请注明出处:http://blog.csdn.net/sinyu890807/article/details/51933728 本文同步发表于我的微信公众号,扫一扫文章底部的二维码或在微信搜索 郭霖 即可关注,每天都有文章更新. 大家好,好像有段时间没写技术文章了.主要是最近<第二行代码>刚刚出版,一直都要忙碌于新书的各种事情,访谈.答疑.勘误处理等等,每天公众号的消息就有一大堆,也是让我目不暇接. 首先我要感谢一下大家对我的支持,目前<第二行代码>销售非常火爆,同时也是收到了