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