![等待 Cmder\ConEmu 中的进程完成](https://linux22.com/image/1603790/%E7%AD%89%E5%BE%85%20Cmder%5CConEmu%20%E4%B8%AD%E7%9A%84%E8%BF%9B%E7%A8%8B%E5%AE%8C%E6%88%90.png)
执行摘要:
为了软件开发调试目的,我使用适用于 Windows 10 x64 的 Cmder 1.3.12。
例如,如果我在 cmd 窗口中运行java –jar app2.jar
,我会得到输出日志(在 cmd 内部),并且正如预期的那样,只有当我的 java 进程终止时,cmd 提示才会可用。这不仅在命令行中运行良好,而且在我的调用应用程序(也是一个 java 应用程序,我们称之为“app1”)内部也运行良好。
但我真正想要的是有一个控制台模拟器(我正在使用 Cmder),可以在其中运行我的脚本/应用程序。这样,我可以获得 cmd 无法提供的功能,例如更大的行缓冲区、彩色日志(ANSI 红色以清楚地显示最终异常)、多个选项卡,甚至支持我的 bash 脚本(除了显示我的(彩色)应用程序日志之外,它还将 stdout 和 stderr 重定向到单个日志文件 - 以供以后使用)。
但是,如果我在 cmd 窗口中运行cmder /TASK mytask
(基本上就是运行),虽然它运行得很顺利,即通过在特色控制台中显示我的日志,但 cmd 提示符将立即可用。甚至在 app2 进程终止之前。如果我从 app1 内部java –jar app2.jar
运行,也会发现类似的行为。cmder /TASK mytask
这就是问题所在:我需要 app2 进程完成之后才能将控制权返回给 app1。以前从来没有过这样的情况!
我觉得在 Cmder 包的某个地方,有某种存根会启动一个应用程序然后立即退出... 有什么办法可以解决这个问题吗?谢谢!
>
细节:
我做了一些挖掘...... mytask 是一个 ConEmu bash 任务:({bash::mytask}
与默认相同{bash::bash}
,使用自定义%cmder_home%\config\user_profile.sh
) - 基本上 - 在 Cmder 内运行 app2。
为了测试目的,我没有直接调用 Cmder,而是尝试了一些 Windows Shell 指令,我认为这些指令会等待其命令参数完成后再将控制权返回给调用应用程序(除了从我的“app1”运行它们之外,我还尝试在 cmd 窗口中运行它们):
start /w Cmder /TASK mytask
call "Cmder" /TASK mytask
cmd /c Cmder /TASK mytask
相同(不良)结果。
我知道 Cmder 基本上是一组软件包,因此我继续进行调查:
ConEmu -run {mytask}
ConEmu -run "java -jar HelloWorld.jar"
我甚至像以前一样尝试使用一些 shell 等待指令(例如“start /w”)调用 ConEmu。结果仍然相同(不理想)!
最后,我查看了 ConEmu 设置中特定于任务的(默认)命令:
cmd /c ""%ConEmuDir%..\git-for-windows\bin\bash" --login -i"
好吧,bash 交互式 shell (-i) 并不是我的专长,所以我没有尝试使用其他 bash 命令\参数。相反,我尝试了其他方法(通过替换整个默认命令):
启动/w“” “%ConEmuDir%..\git-for-windows\bin\bash” --login –i
调用“%ConEmuDir%..\git-for-windows\bin\bash”--login –i
开始/w“我的标题”cmd/c java -jar HelloWorld.jar
java -jar ./HelloWorld.jar
还尝试 Process ‘start’
从 ConEmu 设置功能页面取消选中(默认选中)。
什么都没起作用……在我看来,在 Cmder 包的某个地方,有某种存根启动了一个应用程序,然后立即退出……有什么办法可以解决这个问题吗?谢谢!
编辑:
%cmder_home%\config\user_profile.sh
:
debug_red()(set -o pipefail;“$@”2>&1>&3|sed $'s,.*,\e[31m&\e[m,'>&2)3>&1
debug_red "./$CTRL_App_loader_script_name.sh" 2>&1| tee $LOGNAME
基本上,如果输出来自 stderr,则添加 ansi 红色代码,然后将 stdout 和 stderr 重定向到同一个 $LOGNAME 日志文件。
$CTRL_App_loader_script_name.sh
EXEC_COMMAND="java -Djava.library.path="libs/" -jar CTRL_SENSOR22.jar"
$EXEC_COMMAND
固定名称和位置脚本。这是由 app1 即时创建的,仅运行我的 app2。
答案1
奇怪的是,为了保持阻止我调用的 app1,而调用的 app2 仍然在 Cmder\ConEmu“内部”运行,Single instance mode
必须取消设置 ConEmu 设置。
Single instance mode
设置可以在外貌ConEmu 设置的组窗口(Cmder 版本 1.3.12.915,Windows 10 x64)并在那里描述为“使用现有窗口而不是运行新实例“。
事实上,为了限制 Windows 任务栏中显示的日志窗口数量,我更改了默认设置(未设置 ;-))。我相信你们都同意,这个设置很难被视为本案的嫌疑人……
此外,还应注意是否Close ConEmu with last tab
设置了(任务栏如果不是,当 app2 最终停止运行时,app1 仍将被阻止,并且解除对 app1 的阻止的唯一方法是手动关闭该 ConEmu 窗口。
无论如何,我要感谢所有花时间阅读这个问题的人,希望能够帮助我!
希望这些发现将来能够对某些人有所帮助。