首页 文章

PHP exec(myexe)在PHP App中失败,但在CLI中失败 . 在用户“apache”下运行失败

提问于
浏览
1

我有一个使用PHP的exec()函数由Web应用程序执行的自定义程序(例如myexe) . 使用PHP CLI运行时它不会失败,当我作为用户从命令行运行时,myexe也不会失败 . 我已经构建了myexe,以便在使用valgrind进行分析时没有内存问题 . myexe的大小约为26MB .

为了简化这种情况,我在用户'apache'下的命令行上运行myexe并重现失败 .

su -s /bin/sh apache -c "/usr/local/bin/myexe parm1 parm2..."
==> Segmentation fault (core dumped)

但是当我将用户更改为自己并运行上面的相同命令时,它可以工作 .

su -s /bin/sh mike -c "/usr/local/bin/myexe parm1 parm2..."

==>工作

这是系统日志文件中的错误:

Jul  9 18:26:15 DEVSTN-1 kernel: myexe[27352]: segfault at 7fffa2bf9ff8 ip 0000000000410324 sp 00007fffa2bfa000 error 6 in myexe[400000+5ae000]
    Jul  9 18:26:16 DEVSTN-1 abrt[27353]: Saved core dump of pid 27352 (/usr/local/bin/myexe) to /var/spool/abrt/ccpp-2015-07-09-18:26:15-27352 (13631488 bytes)
    Jul  9 18:26:16 DEVSTN-1 abrtd: Directory 'ccpp-2015-07-09-18:26:15-27352' creation detected
    Jul  9 18:26:17 DEVSTN-1 abrtd: Executable '/usr/local/bin/myexe' doesn't belong to any package and ProcessUnpackaged is set to 'no'
    Jul  9 18:26:17 DEVSTN-1 abrtd: 'post-create' on '/var/spool/abrt/ccpp-2015-07-09-18:26:15-27352' exited with 1
    Jul  9 18:26:17 DEVSTN-1 abrtd: Deleting problem directory '/var/spool/abrt/ccpp-2015-07-09-18:26:15-27352'

我的配置:

  • CentOS6 2.6.32-504.23.4.el6.x86_64

  • Apache / 2.2.15(CentOS)

  • PHP版本5.3.3

假设PHP与错误无关,我是否正确?接下来我该怎么办?

2 回答

  • 0

    正确; PHP与错误无关 . 这是由 myexe 中的无效内存访问(溢出缓冲区或访问已释放的内存)引起的分段错误 . 它似乎已将core dump保存为 /var/spool/abrt/ccpp-2015-07-09-18:26:15-27352 ,因此,请尝试debugging with GDB

    gdb /usr/local/bin/myexe -c /var/spool/abrt/ccpp-2015-07-09-18:26:15-27352
    
    (gdb) bt
    

    并尝试查看可执行文件失败的位置 . 要获得有用的输出,需要使用调试符号进行编译 . 如果它没有以root用户或其他用户身份运行失败,或者在交互式终端中运行,我会查找因无法打开文件,无法读取预期的环境变量等而触发的错误等 . 帮助隔离你的问题 .

    strace 下运行可执行文件可能有助于弄清楚正在发生的事情 .

  • 0

    通过输入bash shell用户用户apache并使用gdb运行程序找到问题 .

    事实证明myexe试图在用户的主目录(/ home / apache)下创建一个目录,该目录不存在 .

    帮助我的是知道如何在不同的用户下使用gdb启动shell .

    这是在另一个用户(apache)下启动shell的命令:su -s / bin / bash apache

相关问题