Назад | Перейти на главную страницу

Почему «jobs -p | kill -n 15 »не работает?

Я новичок в Linux. Собственно говоря, сейчас я использую Cygwin, а не сам Linux.

Я пытаюсь установить RVM (Менеджер версий Ruby).

я делал rm -r ./.rvm -i команда. Я хотел удалить .rvm папку и посмотрите, как меня попросили удалить или нет файл / каталог. Я видел несколько и остановил это Ctrl+Z а затем удалил весь .rvm папку с Windows Explored, просто отправил в корзину.

Но когда я хотел выйти из терминала с exit command я получил сообщение о том, что я остановил работу:

$ jobs
[1]+  Stopped                 rm -r ./.rvm -i

Вот Читал как убить остановленную работу:

kill `jobs -p`

Но я решил попробовать с синтаксисом команды pipe, о котором читал Вот:

Выход каждой команды в конвейере подключается через конвейер ко входу следующей команды.

Итак, я сделал эти попытки, но не смог получить желаемый результат:

$ jobs -p | kill
$ jobs -p | kill -n 15 # 15 is SIGTERM signal
$ jobs -p | kill -n=15 # got error wrong signal spec
$ jobs -p | kill -s SIGTERM

И я не понимаю, почему это не работает. jobs -p перечисляет идентификаторы процессов:

$ jobs -p
340

Так что 340 ID должен перейти в kill -n 15 команда, и это должно убить работу. Но этого не происходит. Зачем? Можно ли в этом случае использовать трубу?

  • Команды имеют несколько стандартных потоков: стандартный вывод (stdout), стандартный ввод (stdin) и стандартный поток ошибок (stderr).
  • Каналы отправляют стандартный вывод команды на стандартный ввод другой команды
  • Kill берет свои параметры через список аргументов, а не из «стандартных» потоков.
  • Некоторые команды позволяют указать «-» в аргументе, чтобы принимать ввод от стандартного ввода в качестве аргументов (не kill команда)
  • Если вы хотите передать стандартный вывод в другой список аргументов, вы можете использовать xargs, но нужно проявлять осторожность, когда есть потенциальные места - а иногда и в других случаях).

В вашем случае jobs -p не должны иметь проблем с xargs, и вы можете использовать следующее:

jobs -p | xargs kill

Если хотите, вы также можете увидеть точные команды, которые он выполняет, используя --verbose (или -t)

jobs -p | xargs --verbose kill
jobs -p | xargs -t kill

xargs это мощный инструмент. Будьте очень осторожны, передавая ему ввод (find -print0, grep -Z, и xargs -0 хорошо ладят при работе с файлами). Это стоит усилий по его использованию (а иногда и экономии времени).

kill не принимает аргументы из стандартного ввода, где они появятся, если вы передадите их, как вы это сделали. Единственный способ использовать kill - указать PID или список PID в качестве аргументов командной строки.

Если SIGTERM (-15) не работает, попробуйте SIGKILL (-9). Тем не менее, рекомендуется сначала попробовать SIGTERM.

 kill `jobs -p`
 kill -9 `jobs -p`

В этом случае вы можете просто ввести: fg, затем нажать ctrl-C.

Если вы хотите напрямую убить оставшийся процесс, в bash вы можете легко выполнить:

kill %1

Что убьет первый процесс в фоновом режиме, как определено заданиями.