目前用 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
|