cURL error: name lookup timed out 这种错误怎么捕获到?linux服务器因nameservers停止工作,导致name lookup timed out的解决方法。
Php/Js/Shell/Go jackxiang 2013-6-21 11:34
背景:用PHP的Curl调用对方的接口,居然返回 curl error: name lookup timed out,一堆错,显然是服务器间歇性抽风。
strace了下发现:
我发现抽风的服务器可以通过--connect-timeout 来减少给接口调用方直接提示:name lookup timed out,
是用curl发现这个问题的:
curl的超时时间设置:
使用curl时,有两个超时时间:一个是连接超时时间,另一个是数据传输的最大允许时间。
连接超时时间用 --connect-timeout 参数来指定,数据传输的最大允许时间用 -m 参数来指定。
例如:
curl --connect-timeout 10 -m 20 "http://XXXXXXX"
连接超时的话,出错提示形如:
curl: (28) connect() timed out!
数据传输的最大允许时间超时的话,出错提示形如:
curl: (28) Operation timed out after 2000 milliseconds with 0 bytes received
--connect-timeout时间短,对本机的接口(接口再访问其它域名的机器)多次访问出现几率大:
According to cURL Error Codes, error code 6 stands for Couldn't resolve host. The given remote host was not resolved.
So I guess your DNS was not propagating properly at times ?
Under the hood, both curl_exec and file_get_contents perform nearly identical operations; they both use libresolv to:
connect to a name server
issue a dns request
process the dns response
To further debug this, you can use curl_getinfo() to get detailed statistics about your requests; you can use this to get an idea of how long each part took using:
CURLINFO_NAMELOOKUP_TIME
CURLINFO_CONNECT_TIME
CURLINFO_PRETRANSFER_TIME
...
The value of
the ptr variable is "name lookup timed out".
I am using the curl_easy interface. I am *not* setting
CURLOPT_NOSIGNAL, and I am also *not* setting any timeout options
(such as CURLOPT_TIMEOUT). My guess is that this crash is caused by a
signal that is emitted. I suspect that I need to set CURLOPT_NOSIGNAL
to 1L and then configure libcurl to use c-ares.
---------------------------------------------------------------------------------------
linux服务器因nameservers停止工作,导致name lookup timed out的解决方法。
刚服务器上的所有在线代理网站突然出现name lookup timed out问题,网上搜索了一下原来是服务器的nameservers问题,打开/etc/resolv.conf,看到
search box.net
nameserver 66.90.68.15
nameserver 66.90.68.169 v. m$ V- V% d, p% d, e
8 {; n5 t: M) Z% W
ping了下66.90.68.15果然不工作了! k4 v! @: x, ]3 \6 Y, ]0 ?0 n
* K, `5 n( m/ H7 X& B+ ]- n2 a
随便在google里输入“free nameservers”找到这家9 U/ J% b. ]* O* E# i, \' [
http://www.resolvingnameserver.com/freerns.html
Our current set of name servers that you can use are:+ F6 I# b3 s, L* |! F
205.234.170.215
205.234.170.217
打开resolv.conf,替换掉原来的IP,上传。- t) x0 \! j8 y
8 K" g8 e; x) T" k6 d: e
重启下服务器,问题解决。
( s8 r: {0 P$ D) r& j; I7 Q
其实还有一家比较有名的我以前介绍过
http://www.opendns.com/
208.67.222.222
208.67.220.220
我自己的windows计算机上用过,不过如果网站打开慢的话会出现他们的广告,不是很爽,希望使用的这家不要出现这样的情况。
) E, ]+ k8 _1 X
2009年3月25日更新:9 F8 ~. O3 c6 U6 f
205.234.170.215
205.234.170.217
有点慢,有时还是会出现“name lookup timed out”的情况,所以我还是选择了5 }& D5 k% s8 F7 V
208.67.222.222
208.67.220.220
来自:http://www.9125.info/redirect.php?fid=5&tid=286&goto=nextnewset
strace了下发现:
我发现抽风的服务器可以通过--connect-timeout 来减少给接口调用方直接提示:name lookup timed out,
是用curl发现这个问题的:
curl的超时时间设置:
使用curl时,有两个超时时间:一个是连接超时时间,另一个是数据传输的最大允许时间。
连接超时时间用 --connect-timeout 参数来指定,数据传输的最大允许时间用 -m 参数来指定。
例如:
curl --connect-timeout 10 -m 20 "http://XXXXXXX"
连接超时的话,出错提示形如:
curl: (28) connect() timed out!
数据传输的最大允许时间超时的话,出错提示形如:
curl: (28) Operation timed out after 2000 milliseconds with 0 bytes received
--connect-timeout时间短,对本机的接口(接口再访问其它域名的机器)多次访问出现几率大:
According to cURL Error Codes, error code 6 stands for Couldn't resolve host. The given remote host was not resolved.
So I guess your DNS was not propagating properly at times ?
Under the hood, both curl_exec and file_get_contents perform nearly identical operations; they both use libresolv to:
connect to a name server
issue a dns request
process the dns response
To further debug this, you can use curl_getinfo() to get detailed statistics about your requests; you can use this to get an idea of how long each part took using:
CURLINFO_NAMELOOKUP_TIME
CURLINFO_CONNECT_TIME
CURLINFO_PRETRANSFER_TIME
...
The value of
the ptr variable is "name lookup timed out".
I am using the curl_easy interface. I am *not* setting
CURLOPT_NOSIGNAL, and I am also *not* setting any timeout options
(such as CURLOPT_TIMEOUT). My guess is that this crash is caused by a
signal that is emitted. I suspect that I need to set CURLOPT_NOSIGNAL
to 1L and then configure libcurl to use c-ares.
---------------------------------------------------------------------------------------
linux服务器因nameservers停止工作,导致name lookup timed out的解决方法。
刚服务器上的所有在线代理网站突然出现name lookup timed out问题,网上搜索了一下原来是服务器的nameservers问题,打开/etc/resolv.conf,看到
search box.net
nameserver 66.90.68.15
nameserver 66.90.68.169 v. m$ V- V% d, p% d, e
8 {; n5 t: M) Z% W
ping了下66.90.68.15果然不工作了! k4 v! @: x, ]3 \6 Y, ]0 ?0 n
* K, `5 n( m/ H7 X& B+ ]- n2 a
随便在google里输入“free nameservers”找到这家9 U/ J% b. ]* O* E# i, \' [
http://www.resolvingnameserver.com/freerns.html
Our current set of name servers that you can use are:+ F6 I# b3 s, L* |! F
205.234.170.215
205.234.170.217
打开resolv.conf,替换掉原来的IP,上传。- t) x0 \! j8 y
8 K" g8 e; x) T" k6 d: e
重启下服务器,问题解决。
( s8 r: {0 P$ D) r& j; I7 Q
其实还有一家比较有名的我以前介绍过
http://www.opendns.com/
208.67.222.222
208.67.220.220
我自己的windows计算机上用过,不过如果网站打开慢的话会出现他们的广告,不是很爽,希望使用的这家不要出现这样的情况。
) E, ]+ k8 _1 X
2009年3月25日更新:9 F8 ~. O3 c6 U6 f
205.234.170.215
205.234.170.217
有点慢,有时还是会出现“name lookup timed out”的情况,所以我还是选择了5 }& D5 k% s8 F7 V
208.67.222.222
208.67.220.220
来自:http://www.9125.info/redirect.php?fid=5&tid=286&goto=nextnewset
[实践OK]vim tab键默认4空格, hz_chenwenbiao。 让vim显示空格,及tab字符 vim 多行注释(转)
Unix/LinuxC技术 jackxiang 2013-6-20 12:33
为了vim更好的支持python写代码,修改tab默认4个空格有两种设置方法:
1. vim /etc/vimrc
set ts=4
set sw=4
举个例子,在多人一起开发项目时,为了使代码风格尽量保持一致,一般不允许在代码使用TAB符,而以4个空格代之。我们可以编辑一个文件,包含下面的内容:
set shiftwidth=4
set expandtab
然后把下面的命令加入到.vimrc中:
autocmd FileType c,cpp set shiftwidth=4 | set expandtab
就可以只在编辑c和cpp文件时实行这种设置了
http://blog.sina.com.cn/s/blog_6f3d37ff0101aat6.html
===========================================
vim显示空格,及tab字符 vim 多行注释(转)
1、显示 TAB 键
文件中有 TAB 键的时候,你是看不见的。要把它显示出来:
:set list
现在 TAB 键显示为 ^I,而 $显示在每行的结尾,以便你能找到可能会被你忽略的空白字符在哪里。
这样做的一个缺点是在有很多 TAB 的时候看起来很丑。如果你使用一个有颜色的终端,或者使用 GUI 模式,Vim 可以用高亮显示空格和TAB。
使用 ‘listchars’ 选项:
:set listchars=tab:>-,trail:-
现在,TAB会被显示成 ">—" 而行尾多余的空白字符显示成 "-"。看起来好多了,是吧?
————————————————————————————
2、让vim显示行尾的空格
fedora 9系统下
在/etc/vimrc文件添加如下两行
highlight WhitespaceEOL ctermbg=red guibg=red
match WhitespaceEOL /\s\+$/
实践证明在centos下的/root/.vimrc里加上也OK,行尾空格变红。-add:2014-10-09
————————————————————————————
http://www.cnblogs.com/chenwenbiao/archive/2011/10/26/2225467.html
1. vim /etc/vimrc
set ts=4
set sw=4
举个例子,在多人一起开发项目时,为了使代码风格尽量保持一致,一般不允许在代码使用TAB符,而以4个空格代之。我们可以编辑一个文件,包含下面的内容:
set shiftwidth=4
set expandtab
然后把下面的命令加入到.vimrc中:
autocmd FileType c,cpp set shiftwidth=4 | set expandtab
就可以只在编辑c和cpp文件时实行这种设置了
http://blog.sina.com.cn/s/blog_6f3d37ff0101aat6.html
===========================================
vim显示空格,及tab字符 vim 多行注释(转)
1、显示 TAB 键
文件中有 TAB 键的时候,你是看不见的。要把它显示出来:
:set list
现在 TAB 键显示为 ^I,而 $显示在每行的结尾,以便你能找到可能会被你忽略的空白字符在哪里。
这样做的一个缺点是在有很多 TAB 的时候看起来很丑。如果你使用一个有颜色的终端,或者使用 GUI 模式,Vim 可以用高亮显示空格和TAB。
使用 ‘listchars’ 选项:
:set listchars=tab:>-,trail:-
现在,TAB会被显示成 ">—" 而行尾多余的空白字符显示成 "-"。看起来好多了,是吧?
————————————————————————————
2、让vim显示行尾的空格
fedora 9系统下
在/etc/vimrc文件添加如下两行
highlight WhitespaceEOL ctermbg=red guibg=red
match WhitespaceEOL /\s\+$/
实践证明在centos下的/root/.vimrc里加上也OK,行尾空格变红。-add:2014-10-09
————————————————————————————
http://www.cnblogs.com/chenwenbiao/archive/2011/10/26/2225467.html
常用的是以名定位:
打开文件夹后在文件夹内单击,然后按键盘上的w键,系统会自动选中了第一个以w开头的文件夹或文件,重复按w键则依次选中第2、3……个以w开头的文件夹或文件。
下面这一点,一些骨灰级的用户都不一定知道。
若键入win则可以直接跳到首个以win开头的文件夹或文件。当然,你也可以键入更多的字以便更准确地定位。不过要注意连续输入速度一定要快,太慢的话win将被分成3次独立操作,那样结果只会定位到n开头的文件。你也可以直接输入中文来选中以相应中文字开头的文件。
若在左侧文件夹树状图中,展开文件夹后输入w则可定位到选定文件夹下w开头的子文件夹。这种方法在桌面或开始菜单中查找程序时也同样有效。
摘录自:http://www.51cto.com/art/200704/45043.htm
打开文件夹后在文件夹内单击,然后按键盘上的w键,系统会自动选中了第一个以w开头的文件夹或文件,重复按w键则依次选中第2、3……个以w开头的文件夹或文件。
下面这一点,一些骨灰级的用户都不一定知道。
若键入win则可以直接跳到首个以win开头的文件夹或文件。当然,你也可以键入更多的字以便更准确地定位。不过要注意连续输入速度一定要快,太慢的话win将被分成3次独立操作,那样结果只会定位到n开头的文件。你也可以直接输入中文来选中以相应中文字开头的文件。
若在左侧文件夹树状图中,展开文件夹后输入w则可定位到选定文件夹下w开头的子文件夹。这种方法在桌面或开始菜单中查找程序时也同样有效。
摘录自:http://www.51cto.com/art/200704/45043.htm
1通用的:鼠标右键+W+F
2.全键盘:ctrl+shift+N
2.全键盘:ctrl+shift+N
[时间转换]java 时间戳和PHP时间戳 的转换问题,13位毫秒获取。
Php/Js/Shell/Go jackxiang 2013-6-17 11:34
背景:ts 参数 时间戳毫秒级,13位的,我用的是PHP的,发现调用失败:
以下代码有点问题:
当mtime[0]是0.012 =>> 给*1000后小数后面的第一个零给去掉了,形成了12位的,不到13位,于是rango给出一个:
估计是后面的是00,所以没显示
比如:第一个其实是:1372057395.0100
后面两个0没显示,则会显示:1372057395.01,12位。
PHP时间戳长度是10位, 如:1294890859
而PHP的microtime()得出的是:
10位的Unix时间(秒)
8位的微妙
足够你用了.截取自己要的13位就可以了.
这里可能涉及到java 时间戳和PHP时间戳 的转换问题:
java时间戳和PHP时间戳 的转换问题:
由于精度不同,导致长度不一致,直接转换错误。
JAVA时间戳长度是13位,如:1294890876859
PHP时间戳长度是10位, 如:1294890859
主要最后三位的不同,JAVA时间戳在PHP中使用,去掉后三位,如:1294890876859-> 1294890876 结果:2011-01-13 11:54:36
echo date('Y-m-d H:i:s','1294890876');
PHP时间戳在JAVA中使用,最后加三位,用000补充,如:1294890859->1294890859000
结果:2011-01-13 11:54:19
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateTime = df.format(1294890859000L);
System.out.println(df);
来自:http://fghzhaopai.blog.163.com/blog/static/4780555620114137146287/
======================================================
Js实现:
10位的时间戳 转 脚本里乘1000 要么你直接后面加3个000 变成13位的 ,
估计也差不多 算成时间 秒位最小单位 基本没什么误差了
1s=1000ms(毫秒)=1000000(微秒)
1s=10^3ms(毫秒)=10^6μs(微秒)
IOS的 typedef long __darwin_time_t; /* time() */
time返回就是 long
不存在小数情况你这个IOS返回的是毫秒还是微秒?了解下。
是秒
那怎么获取到毫秒啊?
乘1000
取到的秒 是 10位的
以下代码有点问题:
当mtime[0]是0.012 =>> 给*1000后小数后面的第一个零给去掉了,形成了12位的,不到13位,于是rango给出一个:
估计是后面的是00,所以没显示
比如:第一个其实是:1372057395.0100
后面两个0没显示,则会显示:1372057395.01,12位。
PHP时间戳长度是10位, 如:1294890859
而PHP的microtime()得出的是:
10位的Unix时间(秒)
8位的微妙
足够你用了.截取自己要的13位就可以了.
这里可能涉及到java 时间戳和PHP时间戳 的转换问题:
java时间戳和PHP时间戳 的转换问题:
由于精度不同,导致长度不一致,直接转换错误。
JAVA时间戳长度是13位,如:1294890876859
PHP时间戳长度是10位, 如:1294890859
主要最后三位的不同,JAVA时间戳在PHP中使用,去掉后三位,如:1294890876859-> 1294890876 结果:2011-01-13 11:54:36
echo date('Y-m-d H:i:s','1294890876');
PHP时间戳在JAVA中使用,最后加三位,用000补充,如:1294890859->1294890859000
结果:2011-01-13 11:54:19
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateTime = df.format(1294890859000L);
System.out.println(df);
来自:http://fghzhaopai.blog.163.com/blog/static/4780555620114137146287/
======================================================
Js实现:
10位的时间戳 转 脚本里乘1000 要么你直接后面加3个000 变成13位的 ,
估计也差不多 算成时间 秒位最小单位 基本没什么误差了
1s=1000ms(毫秒)=1000000(微秒)
1s=10^3ms(毫秒)=10^6μs(微秒)
IOS的 typedef long __darwin_time_t; /* time() */
time返回就是 long
不存在小数情况你这个IOS返回的是毫秒还是微秒?了解下。
是秒
那怎么获取到毫秒啊?
乘1000
取到的秒 是 10位的
PHP多进程编程一,PHP多进程编程二。
Php/Js/Shell/Go jackxiang 2013-6-16 12:48
//阻塞父进程,直到子进程结束,不适合需要长时间运行的脚本,可使用pcntl_wait($status, 0)实现非阻塞式
pcntl_wait($status);
-------------------------------------------------------------------------------------------------------------------------------------------------------
PHP多进程编程一
使用PHP真正的多进程运行模式,适用于数据采集、邮件群发、数据源更新、tcp服务器等环节。
PHP有一组进程控制函数(编译时需要 –enable-pcntl与posix扩展),使得php能在*nix系统中实现跟c一样的创建子进程、使用exec函数执行程序、处理信号等功能。PCNTL使用ticks来作为信号处理机制(signal handle callback mechanism),可以最小程度地降低处理异步事件时的负载。何谓ticks?Tick 是一个在代码段中解释器每执行 N 条低级语句就会发生的事件,这个代码段需要通过declare来指定。
常用的PCNTL函数
pcntl_alarm ( int $seconds )设置一个$seconds秒后发送SIGALRM信号的计数器
pcntl_signal ( int $signo , callback $handler [, bool $restart_syscalls ] )为$signo设置一个处理该信号的回调函数。下面是一个隔5秒发送一个SIGALRM信号,并由signal_handler函数获取,然后打印一个“Caught SIGALRM”的例子:
pcntl_exec ( string $path [, array $args [, array $envs ]] )在当前的进程空间中执行指定程序,类似于c中的exec族函数。所谓当前空间,即载入指定程序的代码覆盖掉当前进程的空间,执行完该程序进程即结束。
pcntl_wait ( int &$status [, int $options ] )阻塞当前进程,只到当前进程的一个子进程退出或者收到一个结束当前进程的信号。使用$status返回子进程的状态码,并可以指定第二个参数来说明是否以阻塞状态调用:
1. 阻塞方式调用的,函数返回值为子进程的pid,如果没有子进程返回值为-1;
2. 非阻塞方式调用,函数还可以在有子进程在运行但没有结束的子进程时返回0。
pcntl_waitpid ( int $pid , int &$status [, int $options ] )功能同pcntl_wait,区别为waitpid为等待指定pid的子进程。当pid为-1时pcntl_waitpid与pcntl_wait一样。在pcntl_wait和pcntl_waitpid两个函数中的$status中存了子进程的状态信息,这个参数可以用于pcntl_wifexited、pcntl_wifstopped、pcntl_wifsignaled、pcntl_wexitstatus、pcntl_wtermsig、pcntl_wstopsig、pcntl_waitpid这些函数。
例如:
子进程在输出child process等字样之后sleep了2秒才结束,而父进程阻塞着直到子进程退出之后才继续运行。
pcntl_getpriority ([ int $pid [, int $process_identifier ]] )取得进程的优先级,即nice值,默认为0,在我的测试环境的linux中(CentOS release 5.2 (Final)),优先级为-20到19,-20为优先级最高,19为最低。(手册中为-20到20)。
pcntl_setpriority ( int $priority [, int $pid [, int $process_identifier ]] )设置进程的优先级。
posix_kill可以给进程发送信号
pcntl_singal用来设置信号的回调函数
当父进程退出时,子进程如何得知父进程的退出
当父进程退出时,子进程一般可以通过下面这两个比较简单的方法得知父进程已经退出这个消息:
当父进程退出时,会有一个INIT进程来领养这个子进程。这个INIT进程的进程号为1,所以子进程可以通过使用getppid()来取得当前父进程的pid。如果返回的是1,表明父进程已经变为INIT进程,则原进程已经推出。
使用kill函数,向原有的父进程发送空信号(kill(pid, 0))。使用这个方法对某个进程的存在性进行检查,而不会真的发送信号。所以,如果这个函数返回-1表示父进程已经退出。
除了上面的这两个方法外,还有一些实现上比较复杂的方法,比如建立管道或socket来进行时时的监控等等。
PHP多进程采集数据的例子
PHP多进程编程二
php在pcntl_fork()后生成的子进程(通常为僵尸进程)必须由pcntl_waitpid()函数进行资源释放。但在 pcntl_waitpid()不一定释放的就是当前运行的进程,也可能是过去生成的僵尸进程(没有释放);也可能是并发时其它访问者的僵尸进程。但可以 使用posix_kill($cid, SIGTERM)在子进程结束时杀掉它。
子进程会自动复制父进程空间里的变量。
PHP多进程编程示例2
如果不需要阻塞进程,而又想得到子进程的退出状态,则可以注释掉pcntl_wait($status)语句,或写成:
pcntl_wait($status, 1);
//或
pcntl_wait($status, WNOHANG);
在上面的代码中,如果父进程退出(使用exit函数退出或redirect),则会导致子进程成为僵尸进程(会交给init进程控制),子进程不再执行。
僵 尸进程是指的父进程已经退出,而该进程dead之后没有进程接受,就成为僵尸进程.(zombie)进程。任何进程在退出前(使用exit退出)都会变成 僵尸进程(用于保存进程的状态等信息),然后由init进程接管。如果不及时回收僵尸进程,那么它在系统中就会占用一个进程表项,如果这种僵尸进程过多, 最后系统就没有可以用的进程表项,于是也无法再运行其它的程序。
预防僵尸进程有以下几种方法:
父 进程通过wait和waitpid等函数使其等待子进程结束,然后再执行父进程中的代码,这会导致父进程挂起。上面的代码就是使用这种方式实现的,但在 WEB环境下,它不适合子进程需要长时间运行的情况(会导致超时)。使用wait和waitpid方法使父进程自动回收其僵尸子进程(根据子进程的返回状 态),waitpid用于临控指定子进程,wait是对于所有子进程而言。
如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler,因为子进程结束后,父进程会收到该信号,可以在handler中调用wait回收
如果父进程不关心子进程什么时候结束,那么可以用signal(SIGCHLD, SIG_IGN)通知内核,自己对子进程的结束不感兴趣,那么子进程结束后,内核会回收,并不再给父进程发送信号,例如:pcntl_signal(SIGCHLD, SIG_IGN);
$pid = pcntl_fork();
//....code
还有一个技巧,就是fork两次,父进程fork一个子进程,然后继续工作,子进程再fork一个孙进程后退出,那么孙进程被init接管,孙进程结束后,init会回收。不过子进程的回收还要自己做。下面是一个例子:
在 fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用 waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程,无法正常结束,此时即使是root身份kill-9也不能杀死僵尸进 程。补救办法是杀死僵尸进程的父进程(僵尸进程的父进程必然存在),僵尸进程成为”孤儿进程”,过继给1号进程init,init会定期调用wait回收 清理这些父进程已退出的僵尸子进程。
所以,上面的示例可以改成:
怎样产生僵尸进程的
一 个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用exit,它 的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。在Linux进程的状态中,僵尸进程是非常特殊的一种,它已 经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,除此之外,僵 尸进程不再占有任何内存空间。它需要它的父进程来为它收尸,如果他的父进程没安装SIGCHLD信号处理函数调用wait或waitpid()等待子进程 结束,又没有显式忽略该信号,那么它就一直保持僵尸状态,如果这时父进程结束了,那么init进程自动会接手这个子进程,为它收尸,它还是能被清除的。但 是如果如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态,这就是为什么系统中有时会有很多的僵尸进程。
任何一个子进程(init 除外)在exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。这是每个子进程在结束时都要经过的 阶段。如果子进程在exit()之后,父进程没有来得及处理,这时用ps命令就能看到子进程的状态是”Z”。如果父进程能及时 处理,可能用ps命令就来不及看到子进程的僵尸状态,但这并不等于子进程不经过僵尸状态。
如果父进程在子进程结束之前退出,则子进程将由init接管。init将会以父进程的身份对僵尸状态的子进程进行处理。
另外,还可以写一个php文件,然后在以后台形式来运行它,例如:
然后在insertLargeData.php文件中做数据库操作。也可以用cronjob + php的方式实现大数据量的处理。
如果是在终端运行php命令,当终端关闭后,刚刚执行的命令也会被强制关闭,如果你想让其不受终端关闭的影响,可以使用nohup命令实现:
[/codes]
//Action代码
public function createAction(){
//....
//将args替换成要传给insertLargeData.php的参数,参数间用空格间隔
system('nohup php -f insertLargeData.php ' . ' args ' . '&');
$this->redirect('/');
}
?>
[/codes]
你还可以使用screen命令代替nohup命令。
分别来自:
http://blog.zol.com.cn/2366/article_2365152.html
http://blog.zol.com.cn/2366/article_2365155.html
pcntl_wait($status);
-------------------------------------------------------------------------------------------------------------------------------------------------------
PHP多进程编程一
使用PHP真正的多进程运行模式,适用于数据采集、邮件群发、数据源更新、tcp服务器等环节。
PHP有一组进程控制函数(编译时需要 –enable-pcntl与posix扩展),使得php能在*nix系统中实现跟c一样的创建子进程、使用exec函数执行程序、处理信号等功能。PCNTL使用ticks来作为信号处理机制(signal handle callback mechanism),可以最小程度地降低处理异步事件时的负载。何谓ticks?Tick 是一个在代码段中解释器每执行 N 条低级语句就会发生的事件,这个代码段需要通过declare来指定。
常用的PCNTL函数
pcntl_alarm ( int $seconds )设置一个$seconds秒后发送SIGALRM信号的计数器
pcntl_signal ( int $signo , callback $handler [, bool $restart_syscalls ] )为$signo设置一个处理该信号的回调函数。下面是一个隔5秒发送一个SIGALRM信号,并由signal_handler函数获取,然后打印一个“Caught SIGALRM”的例子:
pcntl_exec ( string $path [, array $args [, array $envs ]] )在当前的进程空间中执行指定程序,类似于c中的exec族函数。所谓当前空间,即载入指定程序的代码覆盖掉当前进程的空间,执行完该程序进程即结束。
pcntl_wait ( int &$status [, int $options ] )阻塞当前进程,只到当前进程的一个子进程退出或者收到一个结束当前进程的信号。使用$status返回子进程的状态码,并可以指定第二个参数来说明是否以阻塞状态调用:
1. 阻塞方式调用的,函数返回值为子进程的pid,如果没有子进程返回值为-1;
2. 非阻塞方式调用,函数还可以在有子进程在运行但没有结束的子进程时返回0。
pcntl_waitpid ( int $pid , int &$status [, int $options ] )功能同pcntl_wait,区别为waitpid为等待指定pid的子进程。当pid为-1时pcntl_waitpid与pcntl_wait一样。在pcntl_wait和pcntl_waitpid两个函数中的$status中存了子进程的状态信息,这个参数可以用于pcntl_wifexited、pcntl_wifstopped、pcntl_wifsignaled、pcntl_wexitstatus、pcntl_wtermsig、pcntl_wstopsig、pcntl_waitpid这些函数。
例如:
子进程在输出child process等字样之后sleep了2秒才结束,而父进程阻塞着直到子进程退出之后才继续运行。
pcntl_getpriority ([ int $pid [, int $process_identifier ]] )取得进程的优先级,即nice值,默认为0,在我的测试环境的linux中(CentOS release 5.2 (Final)),优先级为-20到19,-20为优先级最高,19为最低。(手册中为-20到20)。
pcntl_setpriority ( int $priority [, int $pid [, int $process_identifier ]] )设置进程的优先级。
posix_kill可以给进程发送信号
pcntl_singal用来设置信号的回调函数
当父进程退出时,子进程如何得知父进程的退出
当父进程退出时,子进程一般可以通过下面这两个比较简单的方法得知父进程已经退出这个消息:
当父进程退出时,会有一个INIT进程来领养这个子进程。这个INIT进程的进程号为1,所以子进程可以通过使用getppid()来取得当前父进程的pid。如果返回的是1,表明父进程已经变为INIT进程,则原进程已经推出。
使用kill函数,向原有的父进程发送空信号(kill(pid, 0))。使用这个方法对某个进程的存在性进行检查,而不会真的发送信号。所以,如果这个函数返回-1表示父进程已经退出。
除了上面的这两个方法外,还有一些实现上比较复杂的方法,比如建立管道或socket来进行时时的监控等等。
PHP多进程采集数据的例子
PHP多进程编程二
php在pcntl_fork()后生成的子进程(通常为僵尸进程)必须由pcntl_waitpid()函数进行资源释放。但在 pcntl_waitpid()不一定释放的就是当前运行的进程,也可能是过去生成的僵尸进程(没有释放);也可能是并发时其它访问者的僵尸进程。但可以 使用posix_kill($cid, SIGTERM)在子进程结束时杀掉它。
子进程会自动复制父进程空间里的变量。
PHP多进程编程示例2
如果不需要阻塞进程,而又想得到子进程的退出状态,则可以注释掉pcntl_wait($status)语句,或写成:
pcntl_wait($status, 1);
//或
pcntl_wait($status, WNOHANG);
在上面的代码中,如果父进程退出(使用exit函数退出或redirect),则会导致子进程成为僵尸进程(会交给init进程控制),子进程不再执行。
僵 尸进程是指的父进程已经退出,而该进程dead之后没有进程接受,就成为僵尸进程.(zombie)进程。任何进程在退出前(使用exit退出)都会变成 僵尸进程(用于保存进程的状态等信息),然后由init进程接管。如果不及时回收僵尸进程,那么它在系统中就会占用一个进程表项,如果这种僵尸进程过多, 最后系统就没有可以用的进程表项,于是也无法再运行其它的程序。
预防僵尸进程有以下几种方法:
父 进程通过wait和waitpid等函数使其等待子进程结束,然后再执行父进程中的代码,这会导致父进程挂起。上面的代码就是使用这种方式实现的,但在 WEB环境下,它不适合子进程需要长时间运行的情况(会导致超时)。使用wait和waitpid方法使父进程自动回收其僵尸子进程(根据子进程的返回状 态),waitpid用于临控指定子进程,wait是对于所有子进程而言。
如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler,因为子进程结束后,父进程会收到该信号,可以在handler中调用wait回收
如果父进程不关心子进程什么时候结束,那么可以用signal(SIGCHLD, SIG_IGN)通知内核,自己对子进程的结束不感兴趣,那么子进程结束后,内核会回收,并不再给父进程发送信号,例如:pcntl_signal(SIGCHLD, SIG_IGN);
$pid = pcntl_fork();
//....code
还有一个技巧,就是fork两次,父进程fork一个子进程,然后继续工作,子进程再fork一个孙进程后退出,那么孙进程被init接管,孙进程结束后,init会回收。不过子进程的回收还要自己做。下面是一个例子:
在 fork()/execve()过程中,假设子进程结束时父进程仍存在,而父进程fork()之前既没安装SIGCHLD信号处理函数调用 waitpid()等待子进程结束,又没有显式忽略该信号,则子进程成为僵尸进程,无法正常结束,此时即使是root身份kill-9也不能杀死僵尸进 程。补救办法是杀死僵尸进程的父进程(僵尸进程的父进程必然存在),僵尸进程成为”孤儿进程”,过继给1号进程init,init会定期调用wait回收 清理这些父进程已退出的僵尸子进程。
所以,上面的示例可以改成:
怎样产生僵尸进程的
一 个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用exit,它 的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。在Linux进程的状态中,僵尸进程是非常特殊的一种,它已 经放弃了几乎所有内存空间,没有任何可执行代码,也不能被调度,仅仅在进程列表中保留一个位置,记载该进程的退出状态等信息供其他进程收集,除此之外,僵 尸进程不再占有任何内存空间。它需要它的父进程来为它收尸,如果他的父进程没安装SIGCHLD信号处理函数调用wait或waitpid()等待子进程 结束,又没有显式忽略该信号,那么它就一直保持僵尸状态,如果这时父进程结束了,那么init进程自动会接手这个子进程,为它收尸,它还是能被清除的。但 是如果如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态,这就是为什么系统中有时会有很多的僵尸进程。
任何一个子进程(init 除外)在exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。这是每个子进程在结束时都要经过的 阶段。如果子进程在exit()之后,父进程没有来得及处理,这时用ps命令就能看到子进程的状态是”Z”。如果父进程能及时 处理,可能用ps命令就来不及看到子进程的僵尸状态,但这并不等于子进程不经过僵尸状态。
如果父进程在子进程结束之前退出,则子进程将由init接管。init将会以父进程的身份对僵尸状态的子进程进行处理。
另外,还可以写一个php文件,然后在以后台形式来运行它,例如:
然后在insertLargeData.php文件中做数据库操作。也可以用cronjob + php的方式实现大数据量的处理。
如果是在终端运行php命令,当终端关闭后,刚刚执行的命令也会被强制关闭,如果你想让其不受终端关闭的影响,可以使用nohup命令实现:
[/codes]
//Action代码
public function createAction(){
//....
//将args替换成要传给insertLargeData.php的参数,参数间用空格间隔
system('nohup php -f insertLargeData.php ' . ' args ' . '&');
$this->redirect('/');
}
?>
[/codes]
你还可以使用screen命令代替nohup命令。
分别来自:
http://blog.zol.com.cn/2366/article_2365152.html
http://blog.zol.com.cn/2366/article_2365155.html
[常用调试]在Chrome浏览器进行JS运行与调试替换firefox调试js的简单运行窗口,新版的firefox地址栏无法执行javascript脚本用命令行shift+F4调出脚本编辑器的解决办法。
Php/Js/Shell/Go jackxiang 2013-6-14 15:10
在Chrome浏览器进行JS运行与调试:
Open the Snippets pane
The Snippets pane lists your snippets. To edit a snippet, open it in one of two ways:
Navigate to Sources > More tabs. More tabs > Snippets.
源代码->代码段->输入:
console.log('Hello, Snippets!');
document.body.innerHTML = '';
const p = document.createElement('p');
p.textContent = 'Hello, Snippets!';
document.body.appendChild(p);
mac按下:⌘+Enter
来自:https://developer.chrome.com/docs/devtools/javascript/snippets/?utm_source=devtools
背景:主要是想通过在FF浏览器的Url栏里输入这样的,看中文:javascript.alert("\u8428\u6587\u7389-\u96ea\u5c71\u4e4b\u604b");
昨天firefox自动将我的3.6版本升级为firefox12,升级完后发现firefox12速度比firefox3.6快了许多,感觉还不错的。但是今天发现在firefox12地址栏中输入javascript:alert(123)这种javascript脚本时,无法执行,打开firebug看发现尽然出错了:uncaught exception:referenceError:alert is not defined。
使用firefox3.6直接在地址栏输入javascript脚本都是可以执行的,升级了到firefox12就不行了?
网上查了一下,说是firefox7+版本以后不支持地址栏运行javascript脚本了,需要安装tab_utilities-1.1.5-fx.xpi扩展。+_+。。。
点击这里下载或者安装tab_utilities-1.1.5-fx.xpi扩展:http://www.coding123.net/download/20120824/firefox-tab-utilities-1.1.5-fx.xpi.aspx,
就可以在firefox7+版本以上的地址栏执行javascript脚本了。
当然还有第二个方法:
You can find that here: Firefox > Web Developer > Scratchpad (Shift+F4) .[这个最好打开一个新的窗口]
试了下果然可用,是这样的:调出那个框框后,直接输入(不再要javascript了):
alert("\u8428\u6587\u7389-\u96ea\u5c71\u4e4b\u604b");
按ctrl+r 就弹出框了,如下提示:
萨文玉-雪山之恋
来自:http://www.coding123.net/article/20120824/firefox-url-address-can-not-execute-javascript.aspx
http://support.mozilla.org/zh-CN/questions/895963
最后,如果一些接口输出中文,如UTF8是三个字节组成,看不清,用那个Shift+F4调出后,直接粘贴json串进里面去,点格式美化就能显示出中文了,不用在地址栏里输出javascript:alert("ssssXXXAAA");。
Open the Snippets pane
The Snippets pane lists your snippets. To edit a snippet, open it in one of two ways:
Navigate to Sources > More tabs. More tabs > Snippets.
源代码->代码段->输入:
console.log('Hello, Snippets!');
document.body.innerHTML = '';
const p = document.createElement('p');
p.textContent = 'Hello, Snippets!';
document.body.appendChild(p);
mac按下:⌘+Enter
来自:https://developer.chrome.com/docs/devtools/javascript/snippets/?utm_source=devtools
背景:主要是想通过在FF浏览器的Url栏里输入这样的,看中文:javascript.alert("\u8428\u6587\u7389-\u96ea\u5c71\u4e4b\u604b");
昨天firefox自动将我的3.6版本升级为firefox12,升级完后发现firefox12速度比firefox3.6快了许多,感觉还不错的。但是今天发现在firefox12地址栏中输入javascript:alert(123)这种javascript脚本时,无法执行,打开firebug看发现尽然出错了:uncaught exception:referenceError:alert is not defined。
使用firefox3.6直接在地址栏输入javascript脚本都是可以执行的,升级了到firefox12就不行了?
网上查了一下,说是firefox7+版本以后不支持地址栏运行javascript脚本了,需要安装tab_utilities-1.1.5-fx.xpi扩展。+_+。。。
点击这里下载或者安装tab_utilities-1.1.5-fx.xpi扩展:http://www.coding123.net/download/20120824/firefox-tab-utilities-1.1.5-fx.xpi.aspx,
就可以在firefox7+版本以上的地址栏执行javascript脚本了。
当然还有第二个方法:
You can find that here: Firefox > Web Developer > Scratchpad (Shift+F4) .[这个最好打开一个新的窗口]
试了下果然可用,是这样的:调出那个框框后,直接输入(不再要javascript了):
alert("\u8428\u6587\u7389-\u96ea\u5c71\u4e4b\u604b");
按ctrl+r 就弹出框了,如下提示:
萨文玉-雪山之恋
来自:http://www.coding123.net/article/20120824/firefox-url-address-can-not-execute-javascript.aspx
http://support.mozilla.org/zh-CN/questions/895963
最后,如果一些接口输出中文,如UTF8是三个字节组成,看不清,用那个Shift+F4调出后,直接粘贴json串进里面去,点格式美化就能显示出中文了,不用在地址栏里输出javascript:alert("ssssXXXAAA");。
http://www.cnblogs.com/panfeng412/archive/2012/03/04/data-recorvery-of-mysql-innodb.html
背景:突然发现因qzone打不开了,qq群里的url也找不开,每次得复制到浏览器里打开,于是找了下,得到如下解决办法。
在电脑的左下角开始按钮里找到 “控制面板” 再到 “程序” 最后再默认程序里面选择“设置默认程序”” 如下:
控制面板\程序\默认程序\设置默认程序 找到左侧浏览器项目 --》然后在右侧确认突出即可。
---
我选了默认为chrome打开后好了。
在电脑的左下角开始按钮里找到 “控制面板” 再到 “程序” 最后再默认程序里面选择“设置默认程序”” 如下:
控制面板\程序\默认程序\设置默认程序 找到左侧浏览器项目 --》然后在右侧确认突出即可。
---
我选了默认为chrome打开后好了。
[群里讨论]Nginx直接访问Memcache以利用Nginx的epoll性能,尽量不要透入到PHP的FastCGI里。
Php/Js/Shell/Go jackxiang 2013-6-14 09:52
问:php fpm 两周遭遇2次假死 求指点 fpm static 256个 另外开了8G的memcache
答:一般都是因为一个请求卡主了以后 这个cgi可能就卡着不动了 合理设置IO的timeout时间
问:IO的timeout时间?
答:就是读写mysql memcache等的过期时间
------
补充:
其实我觉得 如果你是nginx 的话
可以让nginx 直接读memcache 这样可以减轻 fpm 的压力
nginx + lua?淘宝那个 插件吧
恩 这样确实不错
看项目吧
我们这基本纯访问的 可以搞搞这种
有复杂逻辑的还是算了
而且有人说过 万一哪一时刻 memcache 命中率低了
fpm 会暴增 会形成多米洛效应
fpm 是静态的 固定的
答:一般都是因为一个请求卡主了以后 这个cgi可能就卡着不动了 合理设置IO的timeout时间
问:IO的timeout时间?
答:就是读写mysql memcache等的过期时间
------
补充:
其实我觉得 如果你是nginx 的话
可以让nginx 直接读memcache 这样可以减轻 fpm 的压力
nginx + lua?淘宝那个 插件吧
恩 这样确实不错
看项目吧
我们这基本纯访问的 可以搞搞这种
有复杂逻辑的还是算了
而且有人说过 万一哪一时刻 memcache 命中率低了
fpm 会暴增 会形成多米洛效应
fpm 是静态的 固定的
[很少遇到]How to catch curl errors in PHP,怎么捕获PHP里的Curl出现的超时发生的异常错误?
Php/Js/Shell/Go jackxiang 2013-6-13 09:31
背景:用try catch去捕获php的curl错误,是不行的,
The PHP cURL functions do not throw exceptions, so there will never be anything to catch. You'll just have to check the return value for a boolean false.
As to why the cURL timeout does not seem to be occurring after 30 seconds, I'm not sure.
上面代码返回:
error:Could not resolve host: 12122222.com; Host not found
打开注释代码返回:
Fatal error: Uncaught exception 'Exception' with message 'Curl Has Some Wrong ,Please Check It。' in D:\wamp\www\curl_try_catch.php on line 14
Exception: Curl Has Some Wrong ,Please Check It。 in D:\wamp\www\curl_try_catch.php on line 14
---
返回一些状态码,URl如下:curl.haxx.se/libcurl/c/libcurl-errors.html
再进行捕获。
来自:
http://stackoverflow.com/questions/3987006/how-to-catch-curl-errors-in-php
You can use the curl_error() function to know if there was some error, example:
if(curl_errno($c))
{
echo 'error:' . curl_error($c);
}
===================================================
I'm trying to debug this cURL-operation. The var_dump() is returning bool(false)
How can I make it exit the try in that case?
Why not try throwing an Exception when false is returned?
Look here: php.net/manual/en/function.curl-exec.php; basically, false means the operation failed.
Found it: echo curl_error($ch); "Couldn't connect to host"
http://stackoverflow.com/questions/7069822/curl-try-catch-problem
群讨论:
回忆未来-向东-Jàck(372647***) 上午 10:49:40
PHP try catch 能抓到Curl的timeout吗
一周工作五天(243801***) 上午 10:50:58
不能
回忆未来-向东-Jàck(372647***) 上午 10:52:15
常规处理办法是?
三德子(277940***) 上午 10:52:31
curl没有抛异常 除非你去做个errorhandler
回忆未来-向东-Jàck(372647***) 上午 10:52:39
前一段时间我写过博文,但没有根治:http://www.jackxiang.com/post/6445/
errorhandler ?
有示例demo么。
三德子(277940***) 上午 10:53:02
在errorhandler中 抛errorexception
看手册 errorexception这一章
回忆未来-向东-Jàck(372647***) 上午 10:53:48
嗯,超时捕获有code值没?
三德子(277940***) 上午 10:53:57
一周工作五天(243801***) 上午 10:55:41
搞那么复杂干嘛 直接把 超时时间设置长些不就ok了
----------------------------------------------------------------------------------------------
强制用try catch作下实践如下:
访问:http://jackxiang.com/test/testTimeOut
Max Time Out...time out。
Error fetching remote http://jackxiang.com/test/testMaxTimeUrl [ status 0 ]
Error fetching remote http://jackxiang.com/test/testMaxTimeUrl [ status 0 ]
Operation timed out after 5007 milliseconds with 0 bytes received
其实上述说明,不在curl里捕获,在外面一层也是能捕捉到的,只是错误的message提示是:Error:Operation timed out after 5007 milliseconds with 0 bytes received!
________________________________________________________________________________________________
在生产中的代码,用try catch实现的Remote:get,来自KO框架,作了下简单修改(有时Url为空,不知是谁调的,Add Time:2014/03/26):
The PHP cURL functions do not throw exceptions, so there will never be anything to catch. You'll just have to check the return value for a boolean false.
As to why the cURL timeout does not seem to be occurring after 30 seconds, I'm not sure.
上面代码返回:
error:Could not resolve host: 12122222.com; Host not found
打开注释代码返回:
Fatal error: Uncaught exception 'Exception' with message 'Curl Has Some Wrong ,Please Check It。' in D:\wamp\www\curl_try_catch.php on line 14
Exception: Curl Has Some Wrong ,Please Check It。 in D:\wamp\www\curl_try_catch.php on line 14
---
返回一些状态码,URl如下:curl.haxx.se/libcurl/c/libcurl-errors.html
再进行捕获。
来自:
http://stackoverflow.com/questions/3987006/how-to-catch-curl-errors-in-php
You can use the curl_error() function to know if there was some error, example:
if(curl_errno($c))
{
echo 'error:' . curl_error($c);
}
===================================================
I'm trying to debug this cURL-operation. The var_dump() is returning bool(false)
How can I make it exit the try in that case?
Why not try throwing an Exception when false is returned?
Look here: php.net/manual/en/function.curl-exec.php; basically, false means the operation failed.
Found it: echo curl_error($ch); "Couldn't connect to host"
http://stackoverflow.com/questions/7069822/curl-try-catch-problem
群讨论:
回忆未来-向东-Jàck(372647***) 上午 10:49:40
PHP try catch 能抓到Curl的timeout吗
一周工作五天(243801***) 上午 10:50:58
不能
回忆未来-向东-Jàck(372647***) 上午 10:52:15
常规处理办法是?
三德子(277940***) 上午 10:52:31
curl没有抛异常 除非你去做个errorhandler
回忆未来-向东-Jàck(372647***) 上午 10:52:39
前一段时间我写过博文,但没有根治:http://www.jackxiang.com/post/6445/
errorhandler ?
有示例demo么。
三德子(277940***) 上午 10:53:02
在errorhandler中 抛errorexception
看手册 errorexception这一章
回忆未来-向东-Jàck(372647***) 上午 10:53:48
嗯,超时捕获有code值没?
三德子(277940***) 上午 10:53:57
一周工作五天(243801***) 上午 10:55:41
搞那么复杂干嘛 直接把 超时时间设置长些不就ok了
----------------------------------------------------------------------------------------------
强制用try catch作下实践如下:
访问:http://jackxiang.com/test/testTimeOut
Max Time Out...time out。
Error fetching remote http://jackxiang.com/test/testMaxTimeUrl [ status 0 ]
Error fetching remote http://jackxiang.com/test/testMaxTimeUrl [ status 0 ]
Operation timed out after 5007 milliseconds with 0 bytes received
其实上述说明,不在curl里捕获,在外面一层也是能捕捉到的,只是错误的message提示是:Error:Operation timed out after 5007 milliseconds with 0 bytes received!
________________________________________________________________________________________________
在生产中的代码,用try catch实现的Remote:get,来自KO框架,作了下简单修改(有时Url为空,不知是谁调的,Add Time:2014/03/26):
POST的原始数据获得方法
Php/Js/Shell/Go jackxiang 2013-6-11 19:44
Smooth Gestures:
http://www.smoothgestures.com/thankyou/#
http://www.smoothgestures.com/thankyou/#
解决 /bin/rm: Argument list too long
Unix/LinuxC技术 jackxiang 2013-6-9 14:39
背景:前两天对外包的PHP返回慢作了一个xdebug的统计,后来尽管加上了那个rm的crontab,但是后来发现日志依旧在,还是运维发现,上了30G了。
后来查了下crontab的日志文件,发现:
配置:
一:Crontab定时删除,1小时删除一次:
三分钟一清,试过一小时一清,都3G左右大小了:
二:应该是生成的xdebug日志文件太多了造成的(1小时一次有点长了),这个文件删除不了:
出现:Argument list too long。
三:网上找了下,摘录如下:
cache目录,谁知道输入
rm *
的命令后,大概几秒后屏幕就跳出
/bin/rm: argument list too long
条件反射动作,上百度和google查找,找到解决方法和原因,原因是一个文件夹下文件太多,使用rm删除就会出现/bin/rm: Argument list too long错误.
解决方法:http://hintcnuie.javaeye.com/blog/431354
按网址上面写的输入
ls | xargs -n 10 rm -fr ls
就解决了,这句解释为:输出所有的文件名(用空格分割) xargs就是将ls的输出,每10个为一组(以空格为分隔符),作为rm -rf的参数也就是说将所有文件名10个为一组,由rm -rf删除,这样就不会超过命令行的长度了.
另外找到用脚本的方法:
for loop in `ls 目录路径`
do
rm -f $loop
done
注意:$loop是删除的文件名,确保路径是否正确。
但这个还没有实验过。
来自:http://www.dedecms.com/knowledge/servers/linux-bsd/2012/0614/1538.html
第二种方法:
当某个文件夹下的文件太多,不能使用rm删除
# rm * -rf
-bash: /bin/rm: Argument list too long
网上找了个方法,贴上来给大家分享
find PATH -name *.mp3 -exec rm {} \;
如,要删除 /tmp/123/abc 目录下的
find /tmp/123/abc ‘*’ -exec rm {} \;
如当前目录为 /tmp/123 ,想删除 /tmp/123/abc 下的
find ./abc -name ‘*’ -exec rm {} \;
大家可以自己试试,不过要小心处理,别删错重要文件了!!!
来自:http://linux.chinaitlab.com/administer/805334.html
后来查了下crontab的日志文件,发现:
配置:
一:Crontab定时删除,1小时删除一次:
三分钟一清,试过一小时一清,都3G左右大小了:
二:应该是生成的xdebug日志文件太多了造成的(1小时一次有点长了),这个文件删除不了:
出现:Argument list too long。
三:网上找了下,摘录如下:
cache目录,谁知道输入
rm *
的命令后,大概几秒后屏幕就跳出
/bin/rm: argument list too long
条件反射动作,上百度和google查找,找到解决方法和原因,原因是一个文件夹下文件太多,使用rm删除就会出现/bin/rm: Argument list too long错误.
解决方法:http://hintcnuie.javaeye.com/blog/431354
按网址上面写的输入
ls | xargs -n 10 rm -fr ls
就解决了,这句解释为:输出所有的文件名(用空格分割) xargs就是将ls的输出,每10个为一组(以空格为分隔符),作为rm -rf的参数也就是说将所有文件名10个为一组,由rm -rf删除,这样就不会超过命令行的长度了.
另外找到用脚本的方法:
for loop in `ls 目录路径`
do
rm -f $loop
done
注意:$loop是删除的文件名,确保路径是否正确。
但这个还没有实验过。
来自:http://www.dedecms.com/knowledge/servers/linux-bsd/2012/0614/1538.html
第二种方法:
当某个文件夹下的文件太多,不能使用rm删除
# rm * -rf
-bash: /bin/rm: Argument list too long
网上找了个方法,贴上来给大家分享
find PATH -name *.mp3 -exec rm {} \;
如,要删除 /tmp/123/abc 目录下的
find /tmp/123/abc ‘*’ -exec rm {} \;
如当前目录为 /tmp/123 ,想删除 /tmp/123/abc 下的
find ./abc -name ‘*’ -exec rm {} \;
大家可以自己试试,不过要小心处理,别删错重要文件了!!!
来自:http://linux.chinaitlab.com/administer/805334.html