PHP exec(myexe) 在 PHP 应用程序中失败,但在 CLI 中失败。在用户 "apache" 下失败 运行
PHP exec(myexe) fails in PHP App, but not CLI. Fails Running Under User "apache"
我有一个自定义程序(例如 myexe)正在由网络应用程序使用 PHP 的 exec() 函数执行。当 运行 使用 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 与错误无关?
接下来我该做什么?
正确; PHP 与错误无关。这是由 myexe
中的无效内存访问(缓冲区溢出或访问已释放的内存)引起的分段错误。好像省了一个core dump to /var/spool/abrt/ccpp-2015-07-09-18:26:15-27352
, so, try debugging with GDB:
gdb /usr/local/bin/myexe -c /var/spool/abrt/ccpp-2015-07-09-18:26:15-27352
(gdb) bt
并尝试查看可执行文件在哪里失败。要获得有用的输出,需要使用调试符号对其进行编译。如果它没有以 root 用户或其他用户身份 运行 失败,或在交互式终端中 运行 失败,我会寻找可能因无法打开文件、无法读取而触发的错误预期的环境变量等,以帮助隔离您的问题。
运行 strace
下的可执行文件也可能有助于弄清楚发生了什么。
通过输入 bash shell 用户 apache 和 运行 使用 gdb 的程序发现问题。
原来 myexe 试图在用户的主目录 (/home/apache) 下创建一个不存在的目录。
对我有帮助的是知道如何在不同的用户下启动 shell 并使用 gdb。
这是在另一个用户 (apache) 下启动 shell 的命令:
su -s /bin/bash 阿帕奇
我有一个自定义程序(例如 myexe)正在由网络应用程序使用 PHP 的 exec() 函数执行。当 运行 使用 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 与错误无关? 接下来我该做什么?
正确; PHP 与错误无关。这是由 myexe
中的无效内存访问(缓冲区溢出或访问已释放的内存)引起的分段错误。好像省了一个core dump to /var/spool/abrt/ccpp-2015-07-09-18:26:15-27352
, so, try debugging with GDB:
gdb /usr/local/bin/myexe -c /var/spool/abrt/ccpp-2015-07-09-18:26:15-27352
(gdb) bt
并尝试查看可执行文件在哪里失败。要获得有用的输出,需要使用调试符号对其进行编译。如果它没有以 root 用户或其他用户身份 运行 失败,或在交互式终端中 运行 失败,我会寻找可能因无法打开文件、无法读取而触发的错误预期的环境变量等,以帮助隔离您的问题。
运行 strace
下的可执行文件也可能有助于弄清楚发生了什么。
通过输入 bash shell 用户 apache 和 运行 使用 gdb 的程序发现问题。
原来 myexe 试图在用户的主目录 (/home/apache) 下创建一个不存在的目录。
对我有帮助的是知道如何在不同的用户下启动 shell 并使用 gdb。
这是在另一个用户 (apache) 下启动 shell 的命令: su -s /bin/bash 阿帕奇