当前位置: 首页 > Linux

linux进程跟踪php-fpm异常退出重启

时间:2023-04-07 00:22:38 Linux

异常描述公司某测试服务器使用json_decode()方法。php-fpm异常退出的错误日志信息如下:php-fpmchild7970exitedwithcode1after34534.452342secondsfromstartNGINX日志错误只是表示与php-fpm的通信断开了。一开始没有思路502自解思路。一直以为是json扩展的问题。通过请求cli的phpinfo()和php-m,发现有json扩展,机器内存足够。我发现这很奇怪,请问是什么原因呢?然后我在网上搜索。网上方法1说查看/var/log/syslog和/var/log/message日志。但是我们的机器,/var/log里面没有这两个文件(系统是CentOS),不知道哪里设置没有打开?在线方法2修改www.conf中的参数说明:原因是没有参数pm.start_servers按照下面的公式来:pm.start_servers=min_spare_servers+(max_spare_servers-min_spare_servers)/2一般不好用将min_spare_servers设置为20后。这意味着问题不在这里。解决问题,使用strace跟踪php-fpm进程,并将日志输出到文件中。ps-ef|grepphp-fpm|awk'{print"-p"$2"-s10000-o/tmp/strace_"$2".log"}'|xargsstrace监控所有子进程的pids并写入相应的traces.log查看日志,发现公司前同事用的是c包类型,没有写某个文件的权限。发现问题就解决了,给文件加上了读写权限。至此bug已经解决strace常用参数-c统计每次系统调用的执行时间、次数和错误等-d输出strace的标准错误调试信息。-f跟踪由fork调用生成的子进程。-ff如果提供-ofilename,则将所有进程的跟踪结果输出到对应的filename.pid中,pid是每个进程的进程号。-F尝试跟踪vfork调用。当-f时,不跟踪vfork。-h输出简短的帮助信息。-我进入-q禁止输出有关分离的消息。-r打印每个系统调用的相对时间。-t在输出的每一行前加上时间信息。-tt在输出的每一行前添加时间信息,微秒级。-ttt微秒级输出,以秒为单位表示时间。-T显示每次调用所花费的时间。-v输出所有系统调用。有些调用是关于环境变量,Status,input和output的调用,由于使用频繁,默认不输出。-V输出strace版本信息。-x以十六进制形式输出非标准字符串-xx所有字符串都以十六进制形式输出。-a列设置返回值的输出位置。默认值为40。-eexpr指定一个表达式来控制如何跟踪。格式:[qualifier=][!]value1[,value2]...qualifier只能是trace,abbrev,verbose,raw,signal,read,write之一。值是用于限定的符号或数字。默认限定符是trace。感叹号是一个负号。例如:-eopen等同于-etrace=open,表示只跟踪打开的调用。而-etrace!=open表示跟踪open以外的调用。有两个特殊符号all和none。请注意,某些外壳使用!要执行历史中的命令,所以使用\\.-etrace=set只跟踪指定的系统调用。例如:-etrace=open,close,rean,write表示只跟踪这四个系统调用。默认是set=all。-etrace=file只跟踪相关的文件操作系统调用。-etrace=process只跟踪与进程控制相关的系统调用。-etrace=network跟踪所有与网络相关的系统调用。-estrace=signal跟踪所有与系统信号相关的系统调用-etrace=ipc跟踪所有与进程通信相关的系统调用-eabbrev=set设置strace输出的系统调用的结果集。-v和缩写=无。默认为缩写=全部。参数以十六进制显示。-esignal=set指定要跟踪的系统信号。默认是全部。例如signal=!SIGIO(或signal=!io),表示不跟踪SIGIO信号。-呃ead=set输出从指定文件读取的数据。例如:-eread=3,5-ewrite=set输出写入指定文件的数据。-ofilename将strace的输出写入文件filename-ppid跟踪指定的进程pid。-sstrsize指定输出字符串的最大长度。默认值为32。始终输出文件名。-uusername使用用户名的UID和GID执行被跟踪的命令