从Java进程访问子进程控制终端
我有一个长期运行的
Java服务器应用程序,它启动一个子进程来执行特定任务(在这种情况下,使用7z命令行实用程序提取7zip文件的内容,但这个特定的细节在这里不应该相关).
>服务器应用程序在Ubuntu 14下使用Java 8运行. 基本问题似乎是7z实用程序使用getpass系统调用来显示提示和读取用户输入.根据文件:
由于这是一个服务器应用程序,因此让子进程块等待来自Java终端的输入是不可接受的.我想要的是以编程方式关闭子进程终端上的输入,以便getpass调用立即返回而没有输入,并且子进程以错误代码退出.不幸的是,我关闭输入到子进程终端的所有尝试都产生了与上面相同的行为: >我尝试在启动子流程后立即手动关闭 看起来这应该是可行的,因为我已经观察到7z启动时所需的行为与完全相同的命令行作为守护进程的socat进程的子进程,其中终端输入连接到/ dev / null,但是我无法使用我所掌握的工具在Java中实现这一目标. 解决方法
为了排除getpass()函数打开/ dev / tty(进程的控制终端),我们必须安排该实用程序没有控制tty,这是通过调用
setsid()实现的.这个C程序(让我们命名一下) notty)进行此调用,然后执行给定的实用程序:
int main(int argc,char *argv[]) { setsid(); // get rid of the controlling tty close(0); // preclude reading STDIN as well execvp(argv[1],argv+1); // execute the given program file } 我们可以通过将它添加到ProcessBuilder命令,例如,在Java应用程序中使用它. G.: ProcessBuilder pb = new ProcessBuilder("notty","7z",… /*arguments*/); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |