Это обычно делается путем определения search
в /etc/resolv.conf
(см. человека 5 resolv.conf).
Пример (не больше, чем шесть возможных доменов):
search ics.muni.cz ncbr.muni.cz fav.zcu.cz
К просто kill
все фоновые задания, управляемые bash
, сделать
kill $(jobs -p)
Обратите внимание что начиная с обоих jobs
и kill
создаются в bash
, Вы не должны сталкиваться ни с какими ошибками Списка аргументов, слишком долго вводят.
Я предпочитаю проверять наличие заданий перед их уничтожением - так скрипт не завершится, если ничего не запущено.
Кроме того, так короче набирать текст. Закиньте это в свой .bash_profile
:
function killjobs () {
JOBS="$(jobs -p)";
if [ -n "${JOBS}" ]; then;
kill -KILL ${JOBS};
fi
}
Затем выполните:
killjobs
Чтобы убить все запущенные задания.
Используйте xargs
вместо подкоманды $ (jobs -p)
, потому что, если jobs -p
пусто, команда kill завершится ошибкой.
jobs -p | xargs kill
Думаю, в зависимости от того, что выдает результат jobs -p
, решение может немного отличаться. В моем случае
$ jobs -p
[1] - 96029 running some job
[2] + 96111 running some other job
Следовательно, делать следующее нехорошо.
$ jobs -p | xargs kill
kill: illegal process id: [1]
С другой стороны, выполнение kill $(jobs -p)
действительно работает, но влечет за собой множество сообщений об ошибках, поскольку строки PID, отличные от -, также передаются в kill
.
Следовательно, мое решение состоит в том, чтобы сначала grep
использовать PID, а затем использовать xargs
следующим образом:
$ jobs -p | grep -o -E '\s\d+\s' | xargs kill
Похоже, что jobs -p | xargs kill
выполняет свою работу, однако производит некоторый нежелательный вывод, передаваемый по конвейеру для уничтожения. Здесь я группирую вывод jobs -p
по наличию/отсутствию символа + или -
function killjobs() {
JOBS=$(jobs -p)
echo $JOBS | grep -v "+\|-"| awk '{print $2}' | xargs kill -9
echo $JOBS | grep "+\|-"| awk '{print $3}' | xargs kill -9
}
А потом можно просто позвонитьkilljobs
У меня есть несколько фоновых составных команд, которые я хочу корректно завершить, отправив SIGINT каждому процессу в macOS. Ни одно из других решений не работало должным образом, поэтому я придумал это:
jobs -p | xargs -n1 pkill -SIGINT -g
jobs -p
перечисляет фоновые процессы, запущенные текущей оболочкой.
xargs -n1
выполняет pkill один раз для каждого задания.
pkill -SIGINT -g
отправляет SIGINT (так же, как ctrl+c )всем процессам в группе процессов.
Точка @pizdelect привела меня сюда. Задания, созданные с использованием каналов, имеют несколько pid. jobs -p
собирается предоставить только первый.
for j in $(jobs | awk '{gsub("[^0-9]","",$1);printf "%%%s\n", $1}');do kill $j;done
Если вы хотите получить их все, вы должны использовать идентификатор задания.
Принятый ответ @jw013 работает в большинстве ситуаций, за исключением случаев, когда задание имеет фоновые задания, поскольку убивается только лидер группы. (@pizdelect определил это ограничение в этом комментарии .)
@pizdelect также указал, что kill
принимает отрицательные значения PID для выбора всей группы процессов в этом комментарии .
Более того, кому-то может не хотетьсяkill
Stopped
рабочих мест, поэтому jobs -r
может оказаться полезным.
Объединив все эти элементы, мы получили решение, которое уничтожает все запущенные задания, включая фоновые:
for i in $(jobs -rp); do kill -- "-$i"; done
Вот решение, которое убивает все задания, включая фоновые:
for i in $(jobs -p); do kill -- "-$i"; done
zsh
дисквалифицирует их как любые полномочия по теме. – peth 09.03.2013, 01:46kill %${(k)^jobdirs}
, который действительно длиннее; если необходимо перечислить PIDs затем, можно использовать еще дольше${${jobstates#*:*:}%%=*}
. – Gilles 'SO- stop being evil' 28.01.2016, 12:06