我有两个Windows批处理脚本script1.bat
和script2.bat
。 script2.bat
是从script1.bat
启动的。
script1.bat
:
...
start call script2.bat
...
当用户关闭script2.bat
的控制台时,必须关闭 script1.bat
(换句话说,script2.bat
,当script1.bat
为script2.bat
时,应自动关闭其控制台关闭)。但是script2.bat
不应该被杀死,它应该被终止,因为kill
必须释放数据库连接。我的意思是使用terminate
和scrip2.bat
单词进行unix信号teminology。因此script1.sh
不应立即被终止,它应该以允许进程执行良好终止释放资源并在适当时保存状态的方式终止。
我是为unix系统制作的,我解决了以下问题。
...
sh script2.sh > /dev/null 2>&1 &
script2_pid="$!"
trap 'kill -15 $script2_pid' EXIT HUP TERM INT KILL
...
:
script1.bat
如何在Windows上制作?
==== EDIT ====
我认为我的问题对每个人来说并不完全清楚,所以我想澄清一下。
我有java应用程序连接到JBoss应用程序服务器。它现在经过测试,我需要以非常方便的方式启动它们。我准备了批处理脚本(script2.bat
),它启动客户端应用程序和JBoss应用程序。此脚本还执行其他操作,例如设置环境变量。所以standalone.bat
实际上是一个Jboss script1.bat
文件。我不想编辑这个文件。
...
set environment variable
...
REM start jboss
start standalone.bat
REM start my java application
java ...
是我的脚本,它设置环境变量,启动JBoss并启动我的java应用程序。
我的脚本(script1.bat):
{{1}}
当用户关闭Java应用程序时,JBoss也应该关闭。我只需要测试人员方便,我知道在生产环境中它应该以另一种方式工作。 用户关闭我的java客户端应用程序后,我不知道如何自动终止JBoss。 JBoss连接到H2数据库并创建锁定,因此如果JBoss立即被杀死,那么数据库锁仍然存在。如果JBoss进程收到CTRL + C,它会正确终止(删除数据库锁)。我想自动创建它,在用户关闭java客户端应用程序之后,JBoss必须在收到CTRL + C时关闭。 我不知道如何在Windows上执行此操作。但是我在linux上做了这个,我在这个问题上添加了我的代码。
答案 0 :(得分:0)
抱歉,你的脚本毫无意义。 start call script2.bat
? start
和call
的组合是无稽之谈。您可以使用其中一种,也可以不使用两者。
此外,我不得不让你失望。无法关闭控制台但保持代码运行。您甚至无法在Windows中启动隐藏的控制台。关闭控制台将立即停止执行代码。
编辑:
现在我明白你在问什么了。使用
启动第一个脚本 start "somename" script1.bat
这将在控制台中启动script1,并将“somename”作为窗口标题。
在第二个脚本中,您可以使用:
:WORKING
REM Do some stuff here
REM and here
REM and here
FOR /f "tokens=*" %%A IN ('tasklist^ /v^| findstr /i /c:"somename"') DO GOTO WORKING
REM shutdown part
REM close db connections
REM exit script2
此部分将检查标题中带有“somename”的控制台是否正在运行,如果是,则重新进入循环。在循环结束时,它总是检查script1是否仍处于活动状态。一旦找不到,代码就会进入关闭部分。
如果您只想等待script1终止,可以使用PING -n 5 127.0.0.1 > NUL
作为5(或更长时间,只需替换5 ^^)秒超时以避免忙碌等待:
:WORKING
PING -n 5 127.0.0.1 > NUL
FOR /f "tokens=*" %%A IN ('tasklist^ /v^| findstr /i /c:"somename"') DO GOTO WORKING
REM shutdown part
REM close db connections etc.
REM exit script2
答案 1 :(得分:0)
如果在JBoss中启用了CLI,则CLI可以关闭JBoss。下面的批处理显示了如何关闭JBoss
...
set environment variable
...
REM start jboss
start "UNIQUE_NAME" path_to_JBoss\bin\standalone.bat -c standalone.xml
REM start java application
java ...
REM shutdown JBoss by CLI
call path_to_JBoss\bin\jboss-cli.bat --connect ":shutdown"
REM it is just in case. If CLI did not shutdown JBoss, then following line kills JBoss without release of resource.
FOR /f "TOKENS=1,2,*" %%a IN ('tasklist^ /FI "WINDOWTITLE eq UNIQUE_NAME*" /nh') DO taskkill /pid %%b