运行包含带有屏幕的 STDIN 重定向的命令
Posted
技术标签:
【中文标题】运行包含带有屏幕的 STDIN 重定向的命令【英文标题】:Running a command that includes an STDIN redirect with screen 【发布时间】:2021-08-28 09:25:41 【问题描述】:使用Gradle SSH plugin 我将.jar
文件部署到另一台机器。
然后我想在一个独立的screen
会话中运行那个 jar。
如果应用程序不需要在 STDIN 上输入,这将不是问题,运行 screen -dmS screen-name java -jar my.jar
。
我尝试使用 here-string 以下列方式提供输入(除了其他方法),但我没有让其中任何一个工作:
screen -dmS screen-name java -jar my.jar <<< "firstInputLine
SecondInputLine
"
谁能指出我正确的方向?谢谢!
【问题讨论】:
【参考方案1】:我认为您的问题是您正在将输入传递给 screen 命令,而不是实际传递给 java 进程。我会这样做:
-
使用您的输入创建一个文件,类似于
echo "foo" > input.txt
scp
该文件到机器
运行screen
命令并使java 进程直接读取文件(如果该程序可以这样做)或通过运行bash
命令而不是直接运行java
命令正确地管道它。类似于screen -dmS screen-name bash \"cat input.txt | java -jar ...\"
免责声明:上述转义只是近似于我的观点;-)
【讨论】:
我更喜欢不需要手动创建文件的解决方案,但您使用bash
的提示可能会有所帮助。我只是在努力逃避一切……【参考方案2】:
我目前解决了这个问题,首先创建分离的screen
会话,然后使用第二个screen
调用,使用屏幕的stuff
命令转发输入,不再使用here-string:
screen -dmS screen-name java -jar my.jar &&
screen -S screen-name -p 0 -X stuff "firstInputLine^MsecondInputLine^M"
(^M 被解释为 ENTER)
【讨论】:
以上是关于运行包含带有屏幕的 STDIN 重定向的命令的主要内容,如果未能解决你的问题,请参考以下文章