- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
考虑这个示例脚本:
<?php
$pipes = array();
$p = proc_open('cat', array(0 => STDIN, 1 => STDOUT, 2 => STDERR), $pipes);
fgetc(STDIN);
当 /bin/sh
符号链接(symbolic link)到 /bin/dash
(Debian 默认设置)时,cat
在 shell 中执行:
30760 pts/0 S+ 0:00 | \_ php f.php
30761 pts/0 S+ 0:00 | \_ sh -c cat
30762 pts/0 S+ 0:00 | \_ cat
然而,当 /bin/sh
链接到 /bin/bash
时,cat
是 php
:
30786 pts/0 S+ 0:00 | \_ php f.php
30787 pts/0 S+ 0:00 | \_ cat
这是非常烦人的不一致,它使得无法可靠地向生成的进程发送信号(因为信号有时会被 shell 接收)。
为什么是proc_open根据 /bin/sh
指向的位置表现不同?有没有办法不运行 shell,即使 /bin/sh
不是 bash
?
最佳答案
PHP 在这两种情况下都通过/bin/sh 运行命令,区别在于 shell,而不是 PHP。 dash fork 进程以运行命令(在本例中为 cat)并等待它完成。 bash 执行一个 execve(),因此它将自己的进程替换为 cat。
虽然他们似乎已经在以后的版本中修复了它:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=436466
使用 bash 或最新版本的 dash 应该可以解决您的问题,因为执行的命令会获取生成的 shell 的 PID,从而接收信号。
关于PHP proc_open bash 与破折号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22644310/
这是我的代码 $descriptorspec = array( 0 => array("pipe", "r") ); $call_mp4 = "ffmpeg command ...... "; $op
我正在尝试将lighttpd编译为处理器arm的静态,以便可以在Android设备上运行。我正在用交叉编译器arm-musl-linuxeabi编译lighttpd,我在https://bitbuck
这是我想要实现的目标:打开一个 shell(korn 或 bash,没关系),从那个 shell,我想打开一个 ssh 连接(ssh user@host)。在某些时候,可能会提示我输入密码,或者可能会
我正在尝试使用 proc_open() 运行进程功能。正如页面上所指定的 - 我提供了自定义环境变量并尝试打印出来。它显示了我提供的所有变量+始终为 3 个变量:“SLVL”、“PWD”、“_=”。我
我想调用proc_open在后台执行一个脚本,后台进程会在几秒后终止。基本上,该脚本是一个 C/Java/Python 脚本,它将编译并运行用户提交的代码,因此我希望该进程能够在一段时间后终止。 我想
我有一个实用函数,用于通过 CLI(cmd、bash 等)执行程序。它返回一个包含 3 个项目的数组:STDOUT、STDERR 和 EXIT CODE。 到目前为止,它运行良好,没有出现问题。事实上
我正在编写可在 *nix 系统下运行的 php 代码。我需要在 php 代码中调用带有 5 个参数的 python 脚本。一些争论是用户输入,所以可能有任何字符。我不知道如何将参数传递给脚本。我将如何
以下脚本监视 /dev/shm/test 是否有新文件并实时输出有关它的信息。 问题是当用户关闭浏览器时,inotifywait 进程仍然打开,等等。 有什么办法可以避免这种情况吗? array("
我目前正在开发一个在线程序。我正在编写一个 php 脚本,它在命令行中使用 proc_open() (在 Linux Ubuntu 下)执行命令。到目前为止,这是我的代码: array("pipe"
我正在使用带有 pdftk 的 proc_open 来用数据预填充一些表格,这工作得很好,但我不想将结果保存到文件然后读回文件,而是直接打印文件.我有这个工作,所以我没有任何问题。但我想将 proc_
我有一个 PHP 脚本,我想从 PHP 脚本调用一个用 C 编写的进程。有很多方法可以做到这一点(系统,执行...),但是选择函数proc_open。有了这个,我可以使用 C 进程在 stdin 和
我正在尝试使用 proc_open(需要双向支持)调用 C++/Python 文件。 在做了一些在线研究后,我发现创建了这段代码:(我首先用 c++ 尝试,失败后我也尝试了 python) PHP:
我正在运行一个sh 脚本,它通过ubuntu服务器上的php运行java进程。我正在使用 proc_open 来运行该进程。通常工作流程如下: 请求页面 -> 脚本运行(直到完成)-> 结果页面。 在
我在 php 中使用 proc_open 来启动一个子进程并来回发送数据。 有时我想等待进程结束并检索退出代码。 问题是如果进程已经完成,我对proc_close 的调用返回-1。对于 proc_cl
我有 2 个 PHP 脚本,分别是 caller.php 和 task.php。 caller.php 使用 JQuery Ajax 请求调用,然后 caller.php 启动一个进程在后台运行 PH
我有一个 PHP 脚本,我在其中使用 proc_open() 创建了一个新进程。它执行了大约 2 小时,最后我有一个 proc_close()。 有时我需要在中间停止这个进程,我如何杀死/发出信号以停
当尝试使用 ffmpeg 将 wmv 文件(转换为 flv)转换为 flv 时,我在 Windows 上遇到了 proc_open 问题,但我怀疑我会遇到每当某些情况发生时,都会发生相同的情况。 基本
所以我用 $process = proc_open("my_process", $descriptors, $pipes); 打开一个进程 然后我使用 fwrite($pipes[0], "some_
在 PHP 中有一个方便的函数叫做 proc_open .它可用于调用可执行文件,将其 stdin、stdout 和 stderr 作为管道打开。 这个函数在 C++ 中有一个很好的跨平台版本吗?唯一
考虑这个示例脚本: STDIN, 1 => STDOUT, 2 => STDERR), $pipes); fgetc(STDIN); 当 /bin/sh 符号链接(symbolic link)到 /
我是一名优秀的程序员,十分优秀!