Существует ли более компактная форма убийства фоновых заданий, чем:
for i in {1..5}; do kill %$i; done
Кроме того, {1..5}, очевидно, содержит жестко закодированное магическое число, как я могу сделать его "N", где N - это правильное число, без выполнения:
$(jobs | wc -l)
Я фактически использую \ j в PS1, чтобы получить количество управляемых заданий, это эквивалентно?
kill $(jobs -p)
кажется проще.for pid in $(jobs -p); do kill $pid; done
?jobs
которое работает только в том случае, если задания последовательно нумеруются. Да, и «убивать задания по отдельности» не имеет смысла: передача нескольких PIDkill
команде делает то же самое, что и передача их по отдельности.Ответы:
Чтобы выполнить
kill
все фоновые заданияbash
, выполнитеОбратите внимание, что поскольку оба
jobs
иkill
встроеныbash
, вы не должны сталкиваться с ошибками в списке аргументов слишком длинного типа.источник
zsh
лишает их всякого авторитета в этой теме.kill %${(k)^jobdirs}
, что действительно дольше; если вам нужно перечислить PID, вы можете использовать еще дольше${${jobstates#*:*:}%%=*}
.>
Используйте
xargs
вместо$(jobs -p)
подкоманды, потому что еслиjobs -p
пусто, команда kill не будет выполнена.источник
jobs -p | xargs -rn10 kill
будет лучше, еслиjobs -p
не вернет PID. Обратите внимание, что-r
опция является расширением GNU.-r
это краткий формат для--no-run-if-empty
расширения GNU,xargs
который указывает ему не запускать команду, если stdin не имеет данных.Я предпочитаю проверить, существуют ли какие-либо задания, прежде чем их убивать - таким образом, скрипт не потерпит неудачу, если ничего не выполняется
Это также короче, чтобы напечатать. Добавьте это в свой
.bash_profile
:Затем запустите:
Чтобы убить любые рабочие места.
источник
У меня есть несколько сложных составных команд, которые я хочу завершить, отправив SIGINT каждому процессу в macOS. Ни одно из других решений не работало должным образом, поэтому я придумал следующее:
jobs -p
перечисляет фоновые процессы, запущенные текущей оболочкой.xargs -n1
выполняет pkill один раз для каждой работы.pkill -SIGINT -g
отправляет SIGINT (как ctrl + c) всем процессам в группе процессов.источник
Я думаю, в зависимости от того, что
jobs -p
дает результат, решение может быть немного другим. В моем случаеСледовательно, делать следующее нехорошо.
С другой стороны, запуск
kill $(jobs -p)
работает, но влечет за собой много сообщений об ошибках, поскольку строки, не являющиеся PID, также передаютсяkill
.Поэтому, мое решение -
grep
сначала использовать PID, а затем использоватьxargs
следующее:источник
echo $0
показывает? Чтоhelp jobs
показывает? Показанный вывод не соответствует POSIX ; любая реализацияjobs
должна иметь-p
опцию с предполагаемым поведением.jobs -p
сделал только вывод PID. Я только что узнал, что zsh не полностью POSIX-совместимый.Похоже, что
jobs -p | xargs kill
делает работу, однако он производит некоторые нежелательные выходные данные, чтобы убить. Здесь я группирую выводjobs -p
по наличию / отсутствию символа + или -А позже вы можете просто позвонить
killjobs
источник