我有一个bash脚本(由Jenkins执行),该脚本一次调用
local STATUS=$($SERVER_DIR/bin/jboss-cli.sh --controller=$WILDFLY_CONTROLLER --connect --user=$ADMIN_USER --password=$ADMIN_PW command=:shutdown --timeout=$JBOSSTIMEOUT);
此代码段的唯一目的是关闭正在运行的Wildfly进程。调用本身是否应该成功,但是由于某种原因野生蝇未终止,我还添加了另一条检查,该检查在几秒钟后执行
SERVER_PID=`ps aux | grep $SERVER_DIR | grep 'wildfly.xml' | grep -v grep | tr -s ' ' | cut -d ' ' -f 2`;
if [[ ! -z $SERVER_PID ]] ; then
kill -9 $SERVER_PID;
fi
但是,有时-我无法弄清在哪种情况下-代码段的行为不符合预期。
问题类型1)
调用jboss-cli.sh会导致异常
> 2019-02-27_22-05-17 [INFO] Trying to stop wildfly service with jboss-cli.sh /opt/wildfly/bin/jboss-cli.sh --controller=10.0.1.1:9990 --connect --user=XXXX --password=XXXX command=:shutdown --timeout=120 org.jboss.as.cli.CliInitializationException: Failed to connect to the controller at org.jboss.as.cli.impl.CliLauncher.initCommandContext(CliLauncher.java:278) at org.jboss.as.cli.impl.CliLauncher.main(CliLauncher.java:241) at org.jboss.as.cli.CommandLineMain.main(CommandLineMain.java:34) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.jboss.modules.Module.run(Module.java:312) at org.jboss.modules.Main.main(Main.java:460) Caused by: org.jboss.as.cli.CommandLineException: The controller is not available at 10.0.1.27:9990 at org.jboss.as.cli.impl.CommandContextImpl.tryConnection(CommandContextImpl.java:1028) at org.jboss.as.cli.impl.CommandContextImpl.connectController(CommandContextImpl.java:840) at org.jboss.as.cli.impl.CommandContextImpl.connectController(CommandContextImpl.java:819) at org.jboss.as.cli.impl.CliLauncher.initCommandContext(CliLauncher.java:276) ... 8 more Caused by: java.io.IOException: java.net.ConnectException: JBAS012144: Could not connect to http-remoting://10.0.1.1:9990. The connection timed out at org.jboss.as.controller.client.impl.AbstractModelControllerClient.executeForResult(AbstractModelControllerClient.java:129) at org.jboss.as.controller.client.impl.AbstractModelControllerClient.execute(AbstractModelControllerClient.java:71) at org.jboss.as.cli.impl.CommandContextImpl.tryConnection(CommandContextImpl.java:1005) ... 11 more Caused by: java.net.ConnectException: JBAS012144: Could not connect to http-remoting://10.0.1.1:9990. The connection timed out at org.jboss.as.protocol.ProtocolConnectionUtils.connectSync(ProtocolConnectionUtils.java:119) at org.jboss.as.protocol.ProtocolConnectionManager$EstablishingConnection.connect(ProtocolConnectionManager.java:256) at org.jboss.as.protocol.ProtocolConnectionManager.connect(ProtocolConnectionManager.java:70) at org.jboss.as.protocol.mgmt.FutureManagementChannel$Establishing.getChannel(FutureManagementChannel.java:204) at org.jboss.as.cli.impl.CLIModelControllerClient.getOrCreateChannel(CLIModelControllerClient.java:169) at org.jboss.as.cli.impl.CLIModelControllerClient$2.getChannel(CLIModelControllerClient.java:129) at org.jboss.as.protocol.mgmt.ManagementChannelHandler.executeRequest(ManagementChannelHandler.java:117) at org.jboss.as.protocol.mgmt.ManagementChannelHandler.executeRequest(ManagementChannelHandler.java:92) at org.jboss.as.controller.client.impl.AbstractModelControllerClient.executeRequest(AbstractModelControllerClient.java:236) at org.jboss.as.controller.client.impl.AbstractModelControllerClient.execute(AbstractModelControllerClient.java:141) at org.jboss.as.controller.client.impl.AbstractModelControllerClient.executeForResult(AbstractModelControllerClient.java:127) ... 13 more packet_write_wait: Connection to XXX.XXX.XXX.XXX port 22: Broken pipe Build step 'Execute shell' marked build as failure
依次中止bash脚本和Jenkins作业。 因此,问题1:如何捕获异常,并确保使用kill-switch来处理bash脚本并终止wildfly。
问题类型2)
有时通话冻结,并且控制台仅向我显示
2019-02-27_22-05-17 [INFO]尝试使用jboss-cli.sh停止wildfly服务 /opt/wildfly/bin/jboss-cli.sh --controller = 10.0.1.1:9990 --connect --user = XXXX --password = XXXX command =:shutdown --timeout = 120
似乎jboss的timeout属性无法正常工作。 因此,问题2:如何确定呼叫已终止并且没有无限期地运行/等待?
谢谢你, 理查德
答案 0 :(得分:0)
虽然不完全相同,但是可以使用trap
在bash中在某种程度上模拟异常样式的行为。
在尝试这些方法之前,最好先真正理解它们,因此,我强烈建议您参考Bash manual,尤其是conditionals测试过的退出代码的概念。
我通常使用这样的东西:
trap 'echo >&2 "ERROR in $BASH_SOURCE at line $LINENO, Aborting"; exit $LINENO;' ERR
ERR
(通常不区分大小写)是bash中的一种特殊触发器,只要执行的命令返回未被捕获错误,它就会调用其上设置的任何陷阱代码。例如:
$: trap 'echo OW' err
$: false
OW
false
始终返回退出代码1,因此除非被捕获,否则它将触发陷阱,如下所示:
$: trap 'echo OW' err
$: false || echo nope
nope
||
和条件条件链接的底部&&
一起被提及,但基本上,
如果左侧表达式返回&&
-退出状态为true
,则0
会将其评估为右侧表达式。
如果左侧表达式返回 ||
-一个非零退出状态,则false
会评估其为右侧表达式。
这些错误中的 都会捕获(消耗)错误,从而阻止它触发陷阱,就像对退出状态进行的大多数条件测试一样。
所以-假设文件xmp
的内容为“ Hello”,并且上面的陷阱就位。
$: echo Hello>xmp # create simple file
$: grep foo xmp # uncaught fail will trigger trap
OW
$: grep Hello xmp # success doesn't trigger trap
Hello
$: if grep foo xmp; then echo ok; else echo no; fi # caught exception doesn't trigger trap
no
$: grep Hello xmp && echo ok || echo no # success, no trigger
Hello
ok
$: grep foo xmp && echo ok || echo no # caught, no trigger
no
$: grep foo xmp || false # LHS caught, RHS triggers trap
OW
$: grep Hello xmp || false # LHS doesn't trigger RHS, no error, no trigger
Hello
$: grep foo xmp ||: # explicit ignore, : is an alieas for true
# WATCH OUT FOR THIS ONE -
$: grep foo xmp && echo ok # CHECKED, so *caught*
# note no trigger on the last one, because it was tested, even if not explicitly handled...
这些可能会或可能不会有多大帮助,但是能够对任何未捕获的错误保持常规状态,然后显式处理您知道可能会失败但可以解决的事情,或者不是真正做到的事情,总是很高兴的问题。
请确保您了解它在做什么以及它是如何工作的,这样才不会让您感到惊讶。始终测试它是否在按您的预期进行。