Найти тему
Блокнот математика

Рубрика "Секреты Вим". Остановка процесса

Привет, коллеги. Я рассказывал уже, как из Вим "выйти в систему". Способов много: можно из командной строки Вим вызвать любую команду через восклицательный знак (:!ls), можно сохранить "сессию" (:mksession!) и выйти из Вим вовсе (:qa), потом открыть всё как было:

vim -S

Можно и указать имя файла-сессии и потом открыть его:

:mksession имя

и потом

vim -S имя

Это крайности; ещё можно открыть новый bash через :sh и потом закрыть его через control-D

Можно открыть терминал прямо в Вим:

:term

Есть и ещё один способ. О нём полезно знать; даже если не для использования, то чтобы понять, как исправить ситуацию, если случайно в неё попали.

Есть в UNIX такая технология: управление процессами. Процессам можно посылать сигналы, для этого используется команда kill. По названию ясно, какой сигнал посылается чаще всего. Есть и сочетания клавиш, например, <C-C> или <C-Z>.

Все сигналы, которые можно послать задаче.
Все сигналы, которые можно послать задаче.

Есть два сигнала, предписывающие задаче "остановиться". Не завершиться, а просто приостановить работу. Отличаются они тем, что один сигнал задача принимает и делает что посчитает нужным, а второй нельзя ни проигнорировать, ни перехватить. Остановленная задача остается в памяти и к ней можно вернуться. Вот это и надо знать: как вернуться к задаче! Порой случается, что случайно нажимаешь <C-Z> и не можешь понять, где ты оказался и что теперь делать.

Для этого есть встроенная команда fg (сокращение от foreground). Есть еще bg, которая запускает задачу на фоне, ее не видно. Это может быть удобно для вычислительных задач, такая отработает тихо и завершится. Но не для редактора вроде Вим.

Вим можно приостановить через <C-Z>, если вы эту комбинацию не переопределили, или командами :suspend или :stop. Это одно и то же.

Если команда с восклицательным знаком ИЛИ выставлен флаг autowrite, то все буферы будут сохранены. Если же флага нет И команда с восклицательным знаком, то несохраненные буферы останутся несохраненными. Они не пропадут, пока Вим висит в памяти, но и на диске изменения не отразятся.

Вы попадете в bash, где можете делать что Вам угодно, а потом вернётесь в Вим через fg.

В графической версии приостановка сворачивает Вим. В MS Windows тоже.

В каких-то системах <C-Z> работает как :sh, запуская новую оболочку. Возврат в Вим тогда через завершение оболочки (<C-D>).

Кандинский. "Спящая задача на фоне проводов и процессоров".
Кандинский. "Спящая задача на фоне проводов и процессоров".

Для полноты давайте обсудим еще команду (оболочки bash) kill, которая по умолчанию посылает сигнал "завершись!". Процесс должен этот сигнал принять, обработать и просьбу удовлетворить. Однако если процесс завис или просто нахально игнорирует просьбу, то можно послать сигнал с "предложением, которое невозможно отклонить"(c). Это kill с ключом -9.

В обоих случаях надо указать номер процесса. Узнать его позволяет команда ps, я обычно использую ps ax. Выдачу лучше передать grep, чтоб отсеял лишнее. Например, зависший на десятигигибайтном файле Вим отыскивается так:

ps ax | grep vim

Вы узнаете номер процесса.

Есть команда killall, убивающая всё, что подходит под имя. Например,

killall firefox

Так приходится поступать, когда Фокс отъедает слишком много памяти, случается. Кто сожрал всю память и крутит диск, позволяет узнать команда top: она в реальном времени показывает, какой процесс (с номерами) сколько памяти занимает и сколько берет процессорного времени.

Научно-популярные каналы на Дзене: путеводитель
Новости популярной науки12 марта 2022