例如,我有这个:
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)
但它不适用于管道链。我怎样才能让它工作?
我正在寻找将电子邮件发送到多个目的地,即一个发送到用户指定的电子邮件地址,另一个发送到 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) 我试图解决所有情况的一个简单案例。我正在运行一个子进程来执行某个任务,我不希望它要求 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 与外壳交互。可能没有我想的那么容易解决..
今天早些时候,我们遇到了一个由以下 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 pipefail
或set -e
. 是否有可能在 ansible 中做到这一点,最好是对我的所有shell
命令全局进行?
(有关更新,请参阅下面的编辑 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) 我有 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
?
基本上,我有一个父进程,它分叉一个子进程并通过管道将它的 stdin 提供给它。子进程可以在以下两种情况之一终止:
我的父代码大致如下所示:
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
. 然而,这意味着读取循环在关闭之前会进行一次额外的迭代。我怎么可能轮询以查看管道是否已关闭而不必对其进行写入?
我在 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 命令作为列表,结果相同
我的小应用程序出现严重问题;基本上很容易理解:
我的软件,当打开时,做它的事情。
我想专注于打开另一个实例(我的意思是再次打开 .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++ 中执行 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)