
私はさまざまなディストリビューションで実行する必要があるシェルスクリプトを作成しています。その一部は機能しbusybox
、一部は機能しません。
スクリプトは、このtimeout
コマンドを使用して、実行するコマンドを実行するのに時間がかかったか、<time>
それともかかったかを確認します。コマンドを終了する必要があるときは常に返されるので、使用されているデプロイメントはcoreutils
timeout
問題にならないので簡単です。timeout
124
Alpine Linux
私の問題は、busyboxを使用して同じコマンドを実行するときにシャットダウンステータスがタイムアウトした後にコマンドを終了する必要があることです。しかし、0
Ubuntuのパッケージtimeout
でコマンドを使用するbusybox
と143
。
この2つのtimeout
コマンド(すべてbusybox
)が異なる戻り値を提供するのはなぜですか?
コマンドがタイムアウトしたことを確認するために使用できる一貫性または規則はありますか?
答え1
Alpine Linuxには古いバージョンのbusyboxがあるかもしれません。簡単な解決策は、いくつかの出力をstdoutやファイルに書き込むなど、テストできるいくつかの副作用がある他のコマンドを元のコマンドに追加することです。
sleep 2
たとえば、元のコマンドのタイムアウトが1ではなく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
ファイルに書きます。