我尝试通过脚本启动可以交互的进程。
编辑:一般问题是通过 php 启动这些进程。进程启动后,另一个 php 脚本(或再次运行的相同脚本)将读取进程的输出。然后第三个 php 脚本将写入进程的输入。为了模拟通过 php 启动,我确实使用了 bash 脚本,因为它有同样的问题。
为此,我创建了一个 out-file,进程可以向其中写入数据,以及一个 fifo,进程可以从中读取数据。例如,我的进程是 passwd。
当我像这样尝试时:
mkfifo fifo.my
touch out.my
passwd > out.my 2> out.my < fifo.my & echo $!
它不起作用。根据 这篇文章EOF 导致 passwd 进程终止。
按照上述帖子的解决方案,我尝试了
mkfifo fifo.my
touch out.my
cat > fifo.my &
passwd > out.my 2> out.my < fifo.my & echo $!
它创建了两个作业,我可以用它来观察
jobs
我的目标是通过 bash 脚本启动它
#!/bin/bash
cat > fifo.my & PID=$!
echo $PID
当我调用脚本时,会创建一个 PID = $PID 的进程,但不会创建一个作业。而且,更重要的是,
passwd > out.my 2> out.my < fifo.my & echo $!
不起作用,因为 EOF 再次通过管道发送。
我怎样才能通过脚本保持管道畅通?
答案1
我建议为此使用 Tcl 的“expect”库,特别是对于脚本 passwd;它分配一个伪终端,可以消除大多数意外,并让您根据结果采取行动。