web-dev-qa-db-ja.com

Busyboxの `timeout`コマンドのステータスを返す

さまざまなディストリビューションで機能するはずのシェルスクリプトを書いています。その中にはbusyboxを使用しているものと、使用していないものがあります。

このスクリプトは、timeoutコマンドを使用して、実行したコマンドが<time>より長く実行されたかどうかを判断します。 coreutilstimeoutを使用するディストリビューションの場合、これは問題ありません。timeoutがコマンドを強制終了する必要がある場合、常に124を返すため、これは簡単です。

私の問題は、Alpine Linux(busyboxを使用)で同じことを実行すると、タイムアウト後にコマンドを強制終了する必要があった後、終了ステータスが0になることですが、timeoutコマンドを使用するとUbuntuのbusyboxパッケージからは、143で終了します。

どちらもtimeoutからの2つのbusyboxコマンドが異なる戻り値を返すのはなぜですか?

コマンドがタイムアウトしたかどうかを判断するために使用できる一貫性またはルールはありますか?

5
replay

AlpineLinuxにはおそらく以前のバージョンのbusyboxがあります。簡単な解決策は、元のコマンドに、テストできる副作用がある別のコマンドを追加することです。たとえば、出力をstdoutまたはファイルに書き込みます。

たとえば、元のコマンドsleep 2のタイムアウトを1ではなく、

timeout 1 sleep 2

行う

ok=$(timeout 1 bash -c 'sleep 2; echo ok')

$okで問題がないかテストします。明らかに、コマンドがstdoutに書き込む場合は、それをリダイレクトする必要があります。たとえば、fd 3に複製してリダイレクトします。

exec 3>&1
ok=$(timeout 1 bash -c 'my command >&3; echo ok')
exec 3>&-

または、ファイルにecho okを実行します。

3
meuh