私はApache Derbyをインストールするために独自のDebianパッケージを作成しており、インストールの一部として設定スクリプトを実行していくつかのデフォルトユーザーを設定しようとしています。そこでインストール過程でApache Derby Webサーバを駆動させた後、そのクラスの"ping"命令を使って存在をテストしてみましたNetworkServerControl
。
短い時間内にサーバーを起動するために「ping」コマンドが何度も失敗することを期待していたので、各ping間で1秒ずつ一時停止しながら約10回程度ループを回しました。
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コマンドの結果を変数に割り当てようとしましたが、同じエラーが発生しました。
子プロセスの結果をキャプチャし、それがインストールを終了するのを防ぐ方法はありますか?
ベストアンサー1
私はこれがインストール後にスクリプトから呼び出されたと思います。
Debian パッケージングルールは、set -e
どのような場合でもエラーで終了するシェルのポストインストのようなスクリプトを使用することです。捕まらないゼロ以外の終了コードです。たとえば||
、または、&&
またはif
/ elif
、while
またはなどを使用して終了ステータスを「キャプチャ」できますuntil
。詳しくはman bash
(検索)をご覧ください-e.*Exit
。
例えば
ping_count=0
until ping hostname || [ "$ping_count" -gt 5 ]; do
sleep 1 # or whatever
ping_count+=1 # non-posix. won't work with dash.
done
set +e
ping(または既知のエラーコードを返す可能性がある他のコマンド)を実行する前に、この方法を試してください。いいえcare)以降に戻りますset -e
。
注: 私非常に強くお勧めします。ただ完全に削除してくださいset -e
。インストール後に他のプログラムがエラーコードを返す場合、あなた(およびパッケージをインストールする他の人)はそれについて知り、インストールが失敗したかどうかを知りたいとdpkg
思います。