Что делает bash, когда получает сигнал SIGINT?

Даже сделав это, я не уверен, что ZFS правильно их видит и может получить доступ ко всем свойствам диска.

Можете ли вы попробовать это на сервере? Например, в Solaris и illumos вы можете использовать формат или формат -e , чтобы перечислить все распознанные дисковые устройства:

  • Если они распознаются правильно с полными именами, как собственные устройства, это наиболее вероятно, что контроллер находится в режиме HBA (адаптер главной шины) и просто передает их через (лучший вариант)
  • Если они распознаются, но с именами, которые звучат как пронумерованные виртуальные диски от контроллера, вероятно, он находится в RAID режим с настройками JBOD. Это все еще нормально, вы можете построить ZFS поверх него, но позже могут возникнуть проблемы при перемещении диска с контроллера на другой (заменяющий) контроллер. Это зависит от оборудования, а не от ZFS (обычно подойдет контроллер того же типа).
  • Если отображается только один большой диск, вы не можете получить избыточность и самовосстановление ZFS, но получите сообщение об ошибке. Также ваша производительность, вероятно, будет хуже, и все из второго пункта также применимо (я бы этого избегал).
  • Если они не найдены, вы вообще не сможете их использовать (худший случай).
2
28.10.2017, 05:28
1 ответ

В конце концов, bash не работает. Способ, которым процесс оболочки должен обрабатывать sigint, состоит в том, чтобы перехватить его, а затем остановить всю обработку и дождаться завершения всех ожидающих процессов forground. на самом деле нет никаких причин, по которым SIGINT не должен прерывать все, что выполняется на переднем плане. вот почему группы процессов были созданы давным-давно. Каждая «команда», которую bash дает пользователю, должна разветвлять процессы в одной и той же pgroup, и именно в эту pgroup должны перенаправляться сигналы. Нет необходимости пересылать сигналы, если pgroup используется правильно, потому что каждый разветвленный процесс должен по умолчанию иметь ту же обработку сигналов, что и bash. nohup должен вызывать игнорирование sighup == всех разветвленных процессов.

В bash было упущено много деталей относительно оригинальной обработки сигналов оболочки unix и взаимосвязей между процессами. В частности, SIGINT для сценария оболочки должен полностью останавливать весь сценарий оболочки, а не прерывать циклы, которые могут просто привести к запуску дополнительной обработки, которая может уничтожить файлы из-за предыдущей работы, которая не была завершена из-за SIGINT.

Да, оператор trap может помочь вам выйти более аккуратно. Но это никогда не требовалось в оригинальных реализациях оболочки Unix. В первую очередь это был механизм очистки использования временных файлов или других подобных деталей. Теперь требуется, чтобы оболочка завершалась, когда это необходимо, и это затрудняет написание надежных сценариев оболочки, которые можно легко прервать.

0
27.01.2020, 22:35

Теги

Похожие вопросы