Я был в том же месте, что и этот парень, где я думал, что процесс вызвал зависание bash, но вместо этого это заняло некоторое время. Я запустил gem install berkshelf
, и, к счастью, этот процесс обнаружился в Activity Monitor, так что я знал, что он все еще идет, но есть ли более надежный способ сделать это?
2 ответа
Вы на самом деле не можете определить разницу между зависанием процесса или "просто на время". Процесс может реагировать на сигналы, но не обязан .
Когда процесс "зависает", он, вероятно, застрял в бесконечном цикле или ожидает какого-то события, которое никогда не произойдет. Но это также может сделать большую работу.
Например, процесс, который выполняет интенсивную работу, может не сразу реагировать на Ctrl-C (сигнал завершения SIGINT
), но может завершиться немного позже или не завершиться вовсе. Обычно это тот случай, когда вы отправляете SIGKILL
, который не может быть проигнорирован процессом.
Обратите внимание, что во всей этой ситуации фактическая оболочка (например, Bash) никогда не зависает. Проще говоря, оболочка просто выполняет процесс и выводит его на первый план. Вы все еще можете приостановить процесс и продолжить его выполнение в фоновом режиме (Ctrl-Z, затем bg
). Ваша оболочка все еще будет работать.
Хорошая вещь, чтобы сделать, это запустить процессы, которые занимают много времени в подробном режиме. Таким образом, вы можете видеть прогресс, и если он зависает, вы знаете, где и можете (надеюсь) решить проблему. Также (по умолчанию с stty sane
) Ctrl+C отправляет SIGINT
, но Ctrl+Z отправляет SIGTSTP
.