Почему "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`