さまざまなディストリビューションで機能するはずのシェルスクリプトを書いています。その中にはbusybox
を使用しているものと、使用していないものがあります。
このスクリプトは、timeout
コマンドを使用して、実行したコマンドが<time>
より長く実行されたかどうかを判断します。 coreutils
timeout
を使用するディストリビューションの場合、これは問題ありません。timeout
がコマンドを強制終了する必要がある場合、常に124
を返すため、これは簡単です。
私の問題は、Alpine Linux
(busyboxを使用)で同じことを実行すると、タイムアウト後にコマンドを強制終了する必要があった後、終了ステータスが0
になることですが、timeout
コマンドを使用するとUbuntuのbusybox
パッケージからは、143
で終了します。
どちらもtimeout
からの2つのbusybox
コマンドが異なる戻り値を返すのはなぜですか?
コマンドがタイムアウトしたかどうかを判断するために使用できる一貫性またはルールはありますか?
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
を実行します。