
目前用 php cli 模式爬取一个网站内容,因为要执行很久,在 xshell 中输入:
nohup php scrape.php &
回车后, php 继续执行,但是一关闭 xshell ,这个进程也就跟着结束了, nohup 这么脆弱吗? Linux 小白不太懂,求好心 V2 们解答一下,或者有没有更好的让 php 常驻进程的命令?
1 emuhuang 2017 年 3 月 16 日 at ? |
2 torbrowserbridge 2017 年 3 月 16 日 via iPhone screen / tmux |
3 alwayshere OP @emuhuang 什么意思? |
4 loading 2017 年 3 月 16 日 via Android 2 楼 +1 |
5 gouchaoer 2017 年 3 月 16 日 不可能,你先开 error_log 或者 coredump 把原因搞清楚 |
6 gouchaoer 2017 年 3 月 16 日 http://www.bo56.com/一个 echo 引起的进程崩溃 / |
7 spkinger 2017 年 3 月 16 日 用 Supervisor 守护进程,挂了它会尝试重启 |
8 Hello1995 2017 年 3 月 16 日 via Android screen 。另外,如果就一台机器长时间在抓,不用高匿代理访问很容易被拉黑…… |
9 lcdtyph 2017 年 3 月 16 日 不想麻烦的话就 setsid nohup php scrape.php & |
10 Biny 2017 年 3 月 16 日 dnf install screen |
11 elarity 2017 年 3 月 16 日 <?php // fork 一个 php 进程 $pid = pcntl_fork(); if ($pid < 0) exit(' fork error. '); else if ($pid) exit(' I am the parent process '); else { // I am the child process $sid = posix_setsid(); if ($sid < 0) exit; for($i = 0; $i <= 60; $i++) { echo "echo Hello world from PHP daemon.".PHP_EOL; sleep(5); } } 使用 posix_setsid 是至关重要的一步了,上面的代码助你完成 php 脚本 daemon 的完成,不需要借助其他力量,注意骚年,不要搞成僵尸进程 |
12 iyaozhen 2017 年 3 月 16 日 via Android 但是一关闭 xshell ,这个进程也就跟着结束了 不肯能啊,我一直这样用,一般场景你这种做法就行了。是不是 PHP 自己报错了 |
13 w3sy 2017 年 3 月 16 日 http://www.cnblogs.com/allenblogs/archive/2011/05/19/2051136.html 我才发现我和他操作终端时的一个细节不同:他是在当 shell 中提示了 nohup 成功后还需要按终端上键盘任意键退回到 shell 输入命令窗口,然后通过在 shell 中输入 exit 来退出终端;而我是每次在 nohup 执行成功后直接点关闭程序按钮关闭终端.。所以这时候会断掉该命令所对应的 session ,导致 nohup 对应的进程被通知需要一起 shutdown 。 |
14 gouchaoer 2017 年 3 月 16 日 @elarity 教科书般的错误,你需要 2 次 fork 。。。参考这个: https://yangxikun.github.io/linux/2013/11/11/linux-process.html |
15 alwayshere OP @iyaozhen 我手上另外两台服务器都可以 xshell 关闭后, nohup 继续执行,就这个装一样的 centos 6.8 系统, xshell 一关闭,马上就退出 php 进程,测试了好多次都是这样,必须把 xshell 挂起 |
16 elarity 2017 年 3 月 16 日 @gouchaoer yes ! I know , 我直接从 posix_setsid 的手册下搞过来这段 code ,旨在告诉小朋友 setsid ,多谢指正,误导了不少好骚年 |
17 SummerWQM 2017 年 3 月 16 日 这种建议 使用 supervisord 吧 |
18 lululau 2017 年 3 月 16 日 5L +1 |
19 TIGERB 2017 年 3 月 16 日 tmux |
20 HowToMakeLove 2017 年 3 月 16 日 nohup command & 后,需要敲回车退出到 bash 、然后再退出 |
21 alwayshere OP @HowToMakeLove 我是这样做的,连按两次回车,直接右上角关闭 xshell ,然后那个 php 进程也立即终止了 |
22 simple2025 2017 年 3 月 16 日 screen? |
23 minbaby 2017 年 3 月 16 日 这种需求有这么几种做法 1. tmux/screen/byobu(简单)这些工具,可以吧你正在用的会话一直保持下去 2. 使用 supervisor 这类守护进程工具,可以帮助你自己启动,或者重新启动程序(推荐) 3. 自己实现 daemon 功能(参考 https://github.com/minbaby/http-server-learning/blob/master/sample/how_to_make_daemon/daemon.php) |
25 minbaby 2017 年 3 月 16 日 @Jaylee 翻了一下 unix 环境编程的 守护进程那一章,确实是进行了两次 fork ,不过中间有提到, System V 系统有人建议进行两次 fork ,以防止其获取终端控制。不过这似乎并不是必须的吧? |
26 FurN1 2017 年 3 月 16 日 screen |
27 eoo 2017 年 3 月 16 日 via Android pm2 |