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

Я очень новичок в Linux. И на самом деле я сейчас использую Cygwin, а не сам Linux.

Я пытаюсь установить RVM (Ruby Version Manager).

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

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

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

Здесь я прочитал, как убить остановленную работу:

kill `jobs -p`

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

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

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

$ 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 Идентификатор должен идти к kill -n 15 команда, и это должно убить работу. Но этого не происходит. Зачем? Можно ли использовать трубу в этом случае?

4 ответа

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

В вашем случае у заданий -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 в качестве аргументов командной строки.

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

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

kill %1

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

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

 kill `jobs -p`
 kill -9 `jobs -p`
Другие вопросы по тегам