Почему тайм-аут не прерывает «git status», если он длится слишком долго? - PullRequest
0 голосов
/ 02 августа 2020

Запуск timeout 0.01s git status в большом репо, где git status занимает около секунды, не делает ничего, отличного от git status. Т.е. тайм-аут не прерывает Git, если он длится слишком долго. Почему это могло быть?

1 Ответ

1 голос
/ 02 августа 2020

По умолчанию команда тайм-аута просто отправляет сигнал SIGTERM всякий раз, когда истекает тайм-аут. Этот сигнал может быть пойман и проигнорирован процессами, что приведет к тому, что процесс не завершится. Git, вероятно, игнорирует SIGTERM.

Из справочной страницы timeout :

Если сигнал не указан, отправьте сигнал TERM по истечении времени ожидания. Сигнал TERM уничтожает любой процесс, который не блокирует или не перехватывает этот сигнал. Может потребоваться использовать сигнал KILL (9) (...)

Если вам действительно нужен тайм-аут, вы можете использовать переключатель -k для отправки вместо этого SIGKILL. Используйте на свой страх и риск. Это может или не может испортить ваше репо:

timeout -k 0.02s 0.01s git status

Сначала будет отправлен SIGTERM через 0,01 секунды, а затем SIGKILL через 0,02 секунды после первого сигнала .

Обратите внимание, что вам нужно передать две длительности (одну для SIGTERM и одну для SIGKILL). Я предлагаю вам использовать более длительную продолжительность (например, 1 с), иначе git, вероятно, не сможет сделать что-либо полезное, в зависимости от размера вашего репо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...