谈一谈PHP计划任务
2018-06-22 05:21:06来源:未知 阅读 ()
公司所用计划任务均是大概这样子的:
*/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
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:Atom - 安装和配置
下一篇:第一次工作 第一星期问题总结。
- PHP写UltraEdit插件脚本实现方法 2020-03-29
- php 带逗号千位符数字的处理方法 2020-03-28
- PHP三元运算符的结合性介绍 2020-03-28
- PHP静态延迟绑定和普通静态效率的对比 2020-03-28
- 基于php流程控制语句和循环控制语句 2020-03-28
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash