Bash: Что сделать, когда управление-c не уничтожит процесс, есть ли лучшее решение кнопки включения - выключения?

Полный заголовок этого вопроса:

Bash: Что сделать, когда управление-c не уничтожит процесс, вследствие того, что сценарий удара содержит цикл, который называет другой процесс: существует ли лучшее решение кнопки питания включения - выключения?

Заголовок этого вопроса справедливо сам объяснительный, но здесь является некоторой более подробной информацией:

У меня есть выполнение сценария удара, которое называет другую программу. (Выполнения / выполняют другую программу.)

Эта программа является программой данных/подбора кривых, которая не может быть прервана CTRL-C. Но от того, чтобы читать это сообщение я нашел, что могу уничтожить его с CTRL-\

Гипотетические мысли...

Таким образом, возможно просто делать пюре из клавиатуры, удерживая CTRL, и делая пюре \ ключ, НО из чего, если Вы вчера купили действительно дорогую механическую клавиатуру и не имеете достаточного количества денег для покупки другой дешевой клавиатуры, Вы готовы "делать пюре" (потому что Вы не хотите израсходовать любой из тех 10^6 нажатия клавиш, перед которыми Вы имеете, Ваша новейшая механическая клавиатура износится), или альтернативно не имеет достаточного количества времени для нахождения старой клавиатуры в доме, потому что дом или чрезвычайно разупорядочивается (путаница) или потому что существует чрезвычайная ситуация, такая как огонь панорамирования микросхемы, происходящий одновременно...

Также полагайте, что цикл называет эту подходящую программу, и возможно Вы соответствуете 1 000 файлов данных, нажимая \ ключевые 1000 раз, вероятно, займет много времени.

Мысли гиперпространства...

Или даже; что, если Вы сделали ошибку в сценарии удара и он на самом деле выполняет бесконечный цикл?

Что можно сделать для остановки родительского сценария, работающего в этой ситуации? Вы могли отключить свой компьютер, удержать кнопку питания в течение 10 секунд для выключения его, или бросить его в панорамирование микросхемы стреляют для остановки его работа, но эти решения кажутся нечувствительными из-за возможной потери данных, которые могут произойти.

В теории можно было выполнить системный монитор и возможно выйти из процесса удара, но это может быть трудно найти, есть ли у Вас много таких процессов все с тем же именем... Кроме того, у Вас мог бы быть одноядерный компьютер, или многоядерный компьютер с говорит, что ядра N, выполняя N процессы, которые все пытаются использовать 100% ЦП. Или возможно всего 1 процесс использует больше, чем 4 ГБ поршня, который Вы имеете и таким образом, Ваш компьютер является чрезвычайно медленным по этой причине... Слишком медленный, по крайней мере, для выполнения системного монитора на данный момент. Следующий наилучший вариант после того, как это должно нажать CTRL-ALT-F1 и попытаться войти в систему как корень и найти незаконный удар родительским использованием ps -A затем kill PID... Но снова, это может занять много минут Вашего времени, если Вы, компьютер так в большой степени загружается, что он пишет постоянно для свопинга.

Должностное лицо ТЕРМИНА SIG cpu_broken.sh; возобновите работу; ясный экран; ясный thought_processes; продолжить...

Существует ли лучшее решение?

1
задан 16 June 2015 в 18:41

3 ответа

Так в основном Вы выполняете сценарий, который делает все недоступным, и Вы хотите быстрое и легкое решение остановить его. Альтернатива powercycling должна содержать SYSRQ ключ (это - то же как PRTSC ключ во многих случаях), и нажмите один за другим R , E , я , S , U , B . В основном это - безопасный способ уничтожить все рабочие процессы и перезапустить систему.

Альтернатива этому должна сделать sudo nano /proc/sysrq-trigger, записать b, в том файле и сохранить. Система сразу перезапустит

[еще 114] информация: https://en.wikipedia.org/wiki/Magic_SysRq_key

2
ответ дан 3 December 2019 в 07:01

Необходимо уничтожить целую группу процесса. Идентификатор группы процесса (PGID) является PID процесса, который запустил группу. Для уничтожения группы процесса, необходимо найти PID процесса, который запустил группу процесса т.е. сценарий, или управляйте, чтобы запустил все это. Синтаксис:

kill -- -PGID

, Например:

kill -- -1234

Здесь 1234 является PGID (идентификатор Process Group).

Это отправит SIGTERM во все процессы в группе процесса. Для отправки различного сигнала, например, SIGKILL (9), сделайте:

kill -9 -1234

, Как найти PGID:

можно сделать:

ps -eo 'pid,ppid,pgid,cmd'

Этот будет обувь PID, PPID (идентификатор родительского процесса), PGID и имя процесса.

Теперь можно использовать grep или любой другой подходящий метод, чтобы найти PGID и затем уничтожить его упомянутыми выше методами.

причина, которую я имею, делает команду, чтобы показать, что PPID - то, потому что можно также попытаться уничтожить процесс на основе PPID соответствие pkill:

pkill -P PPID

, Например:

pkill -P 6789

Используя этот метод необходимо найти всего родителя (и дочерние процессы) и затем уничтожить их, таким образом, по-моему, уничтожение целого дерева процесса является лучшим путем, если Вы хотите уничтожить всех их.

1
ответ дан 3 December 2019 в 07:01

Обычно можно использовать top, htop или подобный, чтобы найти процесс и и уничтожить его (или если Вы знаете имя или PID процесса, Вы можете killall, pkill и т.д.). Например, с помощью top, я могу выбрать сценарий, работающий из терминала, и уничтожить его путем нажатия k + , Входят :

enter image description here

, Если это не работает, k + 9 + Входят должен использовать сигнал SIGKILL. SIGKILL запрашивает, чтобы процесс был сразу уничтожен, и не ожидает процесса, чтобы закончить мыться, ресурсы и т.д. как SIGTERM делает. , который Ctrl + C процесс только отправляет SIGINT для прерывания процесса, как SIGTERM делает.

Используя структурный вид (нажатие t ) в htop также eans можно определить родительские процессы сценария и уничтожить тех, чтобы удостовериться, что это не продолжает цикличное выполнение.

См. также:

1
ответ дан 3 December 2019 в 07:01

Другие вопросы по тегам:

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