Intereting Posts
Переключитесь на макет dvorak при загрузке. (дешифрование и sddm) Мостовой интерфейс Ethernet update-grub в grml Не удается загрузить TrueCrypt для спасения. На usb с помощью UNetBootin Как grep для 2 строк (условие AND) внутри блока, которые не находятся в одной строке, а затем найти что-то еще в этом же блоке Как умножить и суммировать данные столбца с помощью awk и / sed? Редактирование меню grub Установить список приложений, разрешенных для выполнения непривилегированным пользователем Насколько надежным является один интервал и один параметр счета в SAR? Как суммировать значения двух строк в строке в linux Как проверить, сколько свободного места осталось на устройстве для создания раздела Есть ли способ отправить смс на мобильный номер с помощью сценария оболочки? Убийство процессов в состоянии прерывистого сна? Как git и svn использовать существующий прокси-сервер ssh? Почему я все еще получаю приглашение пароля с помощью ssh с аутентификацией ключа?

Возврат статуса команды Busybox `timeout`

Я пишу сценарий оболочки, который должен работать в разных дистрибутивах, некоторые из которых используют busybox а некоторые – нет.

Этот скрипт использует команду timeout для определения того, выполнялась ли команда, выполняемая дольше, чем <time> или нет. В случае дистрибутивов, использующих timeout coreutils это не проблема, потому что когда timeout пришлось убить команду, он всегда возвращает 124 , так что это просто.

Моя проблема заключается в том, что когда я запускаю то же самое на Alpine Linux (который использует busybox), тогда статус выхода равен 0 после того, как таймауту пришлось убить команду, но когда я использую команду timeout из пакета busybox в Ubuntu, он выходит с 143 .

Почему две команды timeout , которые оба из busybox , дают мне другое возвращаемое значение?

Есть ли какая-либо согласованность или правило в том, что я могу использовать, чтобы определить, была ли или нет команда?

У Alpine Linux, возможно, есть более ранняя версия busybox. Простое решение состоит в том, чтобы добавить к вашей исходной команде другую команду, которая имеет некоторый побочный эффект, который вы можете протестировать, например, написание некоторого вывода на stdout или файл.

Например, если вы хотите перерыв 1 для первоначальной команды sleep 2 , вместо

 timeout 1 sleep 2 

делать

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

и проверить $ok для ok. Очевидно, что если ваша команда пишет в stdout, вам нужно перенаправить ее, например, дублировать ее на fd 3 и перенаправить на нее:

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

или сделать echo ok в файл.