登录  /  注册

PHP关于计划任务的实例

零下一度
发布: 2017-06-23 14:34:44
原创
1639人浏览过

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

*/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登陆服务器<br>2.新建一个php文件test.php,代码如下:

<?php sleep(50);
echo "aaa\n";
file_put_contents("/tmp/test.txt",time());?>
登录后复制

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

$ php test.php &amp;amp;
登录后复制
登录后复制

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

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

$ php test.php &amp;amp;
登录后复制
登录后复制

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

6 使用strace进行追踪:

正常情况下的追踪:
strace -p
登录后复制
Process 1475 attached
restart_syscall(<...>) = 0write(1, "aaa\n", 4aaa
)                    = 4lstat("/tmp/test.txt", 0x7ffe792ebe90)  = -1 ENOENT (No such file or directory)
lstat("/tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=65536, ...}) = 0open("/tmp/test.txt", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3fstat(3, {st_mode=S_IFREG|0644, st_size=0, ...}) = 0lseek(3, 0, SEEK_CUR)                   = 0write(3, "1497614186", 10)              = 10close(3)                                = 0munmap(0x7f4840239000, 528384)          = 0close(2)                                = 0close(1)                                = 0munmap(0x7f4847510000, 4096)            = 0close(0)                                = 0munmap(0x7f4847511000, 4096)            = 0sched_getaffinity(1475, 128, {ffffff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}) = 128sched_setaffinity(0, 128, {ffffff, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}) = 0munmap(0x7f48404c8000, 2119936)         = 0munmap(0x7f48406ce000, 2345056)         = 0munmap(0x7f4840b39000, 2162536)         = 0munmap(0x7f484090b000, 2282472)         = 0munmap(0x7f4840d49000, 323584)          = 0exit_group(0)                           = ?
+++ exited with 0 +++[1]+  Done                    php test.php</...>
登录后复制
<br>
登录后复制

退出后再登陆的追踪:

strace -p 3881

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

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

7 原因:

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

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

$ php test.php &gt; /dev/null 2 &gt;&amp;1 &amp;   这里的&amp; 可以用也可以不用
登录后复制

方法二:<br>使用nohup。

$ nohup php test.php &amp;
登录后复制

说明:

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

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

而我们公司采用的是第一种方法,关于对/dev/null 2 >&1 & 的描述,看另外一篇文章

以上就是PHP关于计划任务的实例的详细内容,更多请关注php中文网其它相关文章!

智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
关于CSS思维导图的课件在哪? 课件
凡人来自于2024-04-16 10:10:18
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号