我正在创建自己的 Debian 软件包来安装 Apache Derby,作为安装的一部分,我希望运行一个配置脚本来设置一些默认用户。因此,在安装过程中,我启动了 Apache Derby 网络服务器,然后使用NetworkServerControl
类的“ping”命令测试它是否存在。
为了让服务器在短时间内启动,我预计“ping”命令会失败几次,所以我循环了大约 10 次,在每次 ping 之间暂停一秒:
let retry_count=0
echo "Testing for the Derby network server..."
$(which java) -Dderby.system.home=/srv/apache/derby -cp /usr/lib/apache/derby/derbynet.jar org.apache.derby.drda.NetworkServerControl ping -h localhost -p 1527 > /dev/null
until [[ $? -eq 0 ]]; do
echo "Network server not available."
let retry_count+=1
if [[ ${retry_count} -ge 10 ]]; then
echo "Network server was not available within ${retry_count} seconds. Terminating install." >&2
exit 1
fi
sleep 1
echo "Testing for the Derby network server..."
$(which java) -Dderby.system.home=/srv/apache/derby -cp /usr/lib/apache/derby/derbynet.jar org.apache.derby.drda.NetworkServerControl ping -h localhost -p 1527 > /dev/null
done
但是我发现第一次 ping 失败(返回 1)并导致整个安装过程失败:
In test_server_up function
Sun Sep 15 12:30:27 BST 2019 : Could not connect to Derby Network Server on host localhost, port 1527: Connection refused (Connection refused)
dpkg: error processing package derby-deb (--install):
installed derby-deb package post-installation script subprocess returned error exit status 1
我尝试将 ping 命令的结果分配给一个变量,但我得到了同样的错误。
无论如何要捕获子流程的结果并防止它终止安装?
我认为这是在您的安装后脚本中或从您的安装后脚本中调用的。
debian 打包约定是使用 运行 shell post-inst 等脚本,在任何未捕获的非零退出代码
set -e
上都会出现错误并退出。您可以使用例如或、 或/ 、或来“捕获”退出状态 。详情请参阅(搜索)。||
&&
if
elif
while
until
man bash
-e.*Exit
例如
在 ping 之前尝试
set +e
(或任何其他可能返回您知道自己不关心的错误代码的命令),然后再返回set -e
。注意:我强烈建议不要完全摆脱它
set -e
。如果 post-inst 中的任何其他程序返回错误代码,您(以及安装软件包的人)确实想知道它,并且您确实想dpkg
知道安装失败。