标签: pipe

如何在 node.js 中检查管道链的完成情况?

例如,我有这个:

var r = fs.createReadStream('file.txt');
var z = zlib.createGzip();
var w = fs.createWriteStream('file.txt.gz');
r.pipe(z).pipe(w);
Run Code Online (Sandbox Code Playgroud)

我想在 r.pipe(z).pipe(w) 完成后做点什么。我试过这样的事情:

var r = A.pipe(B);
r.on('end', function () { ... });
Run Code Online (Sandbox Code Playgroud)

但它不适用于管道链。我怎样才能让它工作?

javascript pipe node.js chain

5
推荐指数
1
解决办法
1694
查看次数

在 Exim 中使用管道进行邮件路由

我正在寻找将电子邮件发送到多个目的地,即一个发送到用户指定的电子邮件地址,另一个发送到 php 脚本。在网上冲浪,我得出结论,我必须在路由器中使用管道并传输我的邮件代理的配置,即在我的情况下是 Exim。我尝试但未能在我的 Exim 配置中嵌入管道传输。服务器导致管道传输失败。需要帮助解决此问题。我将我的 exim.cnf 文件修改为:

############ ROUTERS
system_aliases:
driver = accept 
domains = **.**.**.**(my Domain) 
transport = use_pipe

############ TRANSPORT
use_pipe:
debug_print = "Using Pipe Transport"
driver = pipe
command = /etc/script.php
return_path_add
delivery_date_add
envelope_to_add
return_output
Run Code Online (Sandbox Code Playgroud)

其中 script.php 是我要发送文件的第二个目的地。以下是日志:

 3402   uid=3000 gid=3000 pid=3402
 3402   auxiliary group list: 3000
 3402   home=NULL current=/
 3402 set_process_info:  3402 delivering 1ZTPOU-0000sn-JB to abc using use_pipe
 3402 Using Pipe Transport
 3402 use_pipe transport entered
 3402 direct command:
 3402   argv[0] = /etc/testScript.php
 3402 direct …
Run Code Online (Sandbox Code Playgroud)

php linux centos exim pipe

5
推荐指数
1
解决办法
1273
查看次数

防止意外的 stdin 读取并锁定子进程

我试图解决所有情况的一个简单案例。我正在运行一个子进程来执行某个任务,我不希望它要求 stdin,但在我什至不希望的极少数情况下,它可能会尝试读取。我想防止它在这种情况下挂起。

这是一个经典的例子:

import subprocess
p = subprocess.Popen(["unzip", "-tqq", "encrypted.zip"])
p.wait()
Run Code Online (Sandbox Code Playgroud)

这将永远挂起。我已经尝试添加

stdin=open(os.devnull)
Run Code Online (Sandbox Code Playgroud)

还有这样的..

如果我找到有价值的解决方案,我会发布。足以让我在父进程中收到异常 - 而不是无休止地进行通信/等待。

更新:似乎问题可能比我最初预期的更复杂,子进程(在密码和其他情况下)从其他文件描述符读取 - 例如 /dev/tty 与外壳交互。可能没有我想的那么容易解决..

python linux shell subprocess pipe

5
推荐指数
1
解决办法
1501
查看次数

Ansible:强制执行管道故障

今天早些时候,我们遇到了一个由以下 shell 管道引起的严重问题:

- name: get remote branches
  shell: git ls-remote -h git@bitbucket.org:orga/repo.git | sed 's_.*refs/heads/__g'
  register: branches_remote
Run Code Online (Sandbox Code Playgroud)

git命令失败,而是整个管道的返回码为0。这是默认的bash / sh的行为

要解决此问题,在 sh/bash 中,您可以set -o pipefailset -e. 是否有可能在 ansible 中做到这一点,最好是对我的所有shell命令全局进行?

error-handling bash shell pipe ansible

5
推荐指数
1
解决办法
2591
查看次数

如何让 Python 的 subprocess() 与 input() 交互?

(有关更新,请参阅下面的编辑 1)

我需要与我在 Python 3 中编写的菜单进行交互。
但是,无论我尝试什么,我都无法input()调用该行。
(这是get_action()函数的最后一行)。

以下是我想与之交互的(简化的)脚本subprocess()

$ cat test_menu.py
#!/usr/bin/env python3

action_text = """
5. Perform addition
6. Perform subtraction
Q. Quit
"""

def get_action():
    print(action_text)
    reply = input("Which action to use? ")

if __name__ == "__main__":
    get_action()
Run Code Online (Sandbox Code Playgroud)

subprocess()test_menu.py上面交互的基于代码是:

$ cat tests1.py
import subprocess

cmd = ["/usr/bin/python3","./test_menu.py"]

process = subprocess.Popen(cmd,
                           shell=False,
                           bufsize=0,
                           stdin=subprocess.PIPE,
                           stdout=subprocess.PIPE,
                           stderr=subprocess.PIPE)

for i in range(8):
    output = process.stdout.readline()
    print output.strip()

process.stdin.write('%s\n' % "5")
process.stdin.flush() …
Run Code Online (Sandbox Code Playgroud)

python subprocess pipe popen python-3.x

5
推荐指数
1
解决办法
3766
查看次数

使用 Java 中的 ProcessBuilder 将进程的输出重定向到另一个进程的输入

我有 processBuilders 定义的两个进程:

ProcessBuilder pb1 = new ProcessBuilder (...)
ProcessBuilder pb2 = new ProcessBuilder (...)
Run Code Online (Sandbox Code Playgroud)

我希望 的输出pb1是 的输入pb2。我在文档中发现我可以pb2通过使用管道从另一个进程读取的输入:

pb2.redirectInput(Redirect.PIPE);
Run Code Online (Sandbox Code Playgroud)

但是,如何指定我希望此管道从 的输出中读取pb1

java pipe io-redirection processbuilder

5
推荐指数
1
解决办法
4801
查看次数

检查 unix 管道是否关闭而不写入任何内容?

基本上,我有一个父进程,它分叉一个子进程并通过管道将它的 stdin 提供给它。子进程可以在以下两种情况之一终止:

  • 管道的写端被父进程关闭,这意味着它到达了 stdin 的末尾,从而接收到一个EOF
  • 或者它通过管道接收某个输入(在这种情况下为-1)并退出

我的父代码大致如下所示:

close(pi[0]); // close input end
signal(SIGPIPE, SIG_IGN); // do not handle SIGPIPE
char buffer;
int ok = 1;
while(ok && read(STDIN_FILENO, &buffer, 1) > 0)  {
    int b_written = write(pi[1], &buffer, 1);
    if(b_written == -1) {
        if(errno == EPIPE) ok = 0;
        else perror("pipe write"); // some other error
    }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我通过检查errno == EPIPE. 然而,这意味着读取循环在关闭之前会进行一次额外的迭代。我怎么可能轮询以查看管道是否已关闭而不必对其进行写入?

c unix pipe process

5
推荐指数
2
解决办法
2531
查看次数

docker-compose 在命令中使用管道

我在 docker-compose (1.7 build 0d7bf73 , compose file format version 1) 中运行以下命令时遇到问题,它可以从命令行 (docker 1.10.3) 正常工作:

docker run --rm --entrypoint="/bin/bash" node:4 -c "node gridd.js -t | ./node_modules/bunyan/bin/bunyan"
Run Code Online (Sandbox Code Playgroud)

我的码头工人组成:

grid:
  image: node:4-slim
  entrypoint: /bin/bash
  command: -c "node gridd.js -t | ./node_modules/bunyan/bin/bunyan"
Run Code Online (Sandbox Code Playgroud)

使用这个 docker-compose 文件会导致

marcel@client ~/grid $ docker-compose -f ../docker-compose-test.yml -p test up
Removing test_grid_1
Recreating 4e0104efc149_4e0104efc149_4e0104efc149_test_grid_1

ERROR: for grid  Container command not found or does not exist.
Attaching to
Run Code Online (Sandbox Code Playgroud)

我也尝试使用 exec 方法,docker-compose 命令作为列表,结果相同

pipe docker-compose

5
推荐指数
1
解决办法
4349
查看次数

将参数传递给同一应用程序的另一个实例

我的小应用程序出现严重问题;基本上很容易理解:

我的软件,当打开时,做它的事情。

我想专注于打开另一个实例(我的意思是再次打开 .exe),检查它是否已经打开。如果不是简单地启动应用程序,而是它已经在运行(也称为第二个或更多实例)“简单地”传递输入参数(args 字符串数组)传递给第一个实例,那么它将适当地处理它。

这是我的程序.cs

static class Program
{
    static Mutex mutex = new Mutex(true, "{blabla}");

    [STAThread]
    static void Main(String[] args)
    {
        if (mutex.WaitOne(TimeSpan.Zero, true))
        {
            //First Instance!

            try
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);

                CALL A MY STATIC METHOD, DO SOME THINGS

                Application.Run(new Form1());
            }
            finally
            {
                mutex.ReleaseMutex();
            }
        }
        else
        {
            //Not-so-first instance!
            CALL A STATIC METHOD, 
            DO OTHER THINGS LIKE COMUNICATE WITH FIRST INSTANCE

            SIMPLY CLOSE.
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这只会(使用互斥锁)识别它是否已经打开,但(当然)它无法与主实例进行任何通信。

我已经尝试了很多东西,但我无法让它工作。

我试过这个但我真的不明白(在浪费了很多时间之后)如何放置我的“第一次”代码和“已经运行”的代码。

也试过MSMQ但我不能让它工作。 …

c# arguments msmq pipe instance

5
推荐指数
1
解决办法
2776
查看次数

将 Powershell.exe 的输入和输出重定向到 C++ 中的管道

我正在尝试在 C++ 中执行 powershell 命令并通过管道获取其输出。

我的程序非常适合 cmd.exe。但是,当我尝试用 powershell.exe 做同样的事情时,我只得到“W”作为输出。

我已经注释了下面代码中需要修改以执行 powershell.exe 的行 下面是我的适用于 cmd.exe 的代码:

        HANDLE stdinRd, stdinWr, stdoutRd, stdoutWr;
        DWORD readFromCmd();
        DWORD writeToCmd(CString command);
        int main(int argc,char* argv[])
        {
            SECURITY_ATTRIBUTES sa={sizeof(SECURITY_ATTRIBUTES), NULL, true};
            if(!CreatePipe(&stdinRd, &stdinWr, &sa, 1000000) || !CreatePipe(&stdoutRd,&stdoutWr, &sa, 1000000)) 
            {
                printf("CreatePipe()");
            }
            STARTUPINFO si;
            PROCESS_INFORMATION pi;
            GetStartupInfo(&si);
            si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
            si.wShowWindow = SW_HIDE;
            si.hStdOutput = stdoutWr;
            si.hStdError = stdoutWr;                  
            si.hStdInput = stdinRd; 

    // If powershell.exe is invoked, it does not work, however works for cmd.exe …
Run Code Online (Sandbox Code Playgroud)

c++ powershell winapi pipe named-pipes

5
推荐指数
1
解决办法
2115
查看次数