Уничтожьте все фоновые задания

Это обычно делается путем определения search в /etc/resolv.conf (см. человека 5 resolv.conf).

Пример (не больше, чем шесть возможных доменов):

search ics.muni.cz ncbr.muni.cz fav.zcu.cz

65
28.01.2016, 03:17
8 ответов

К просто kill все фоновые задания, управляемые bash, сделать

kill $(jobs -p)

Обратите внимание что начиная с обоих jobs и kill создаются в bash, Вы не должны сталкиваться ни с какими ошибками Списка аргументов, слишком долго вводят.

106
27.01.2020, 19:32
  • 1
    Также для потомства, какой bahamat думает, способ выполнить в нем zsh дисквалифицирует их как любые полномочия по теме. –  peth 09.03.2013, 01:46
  • 2
    я чувствую, что должен знать это, но как '$' работает здесь? –  fersarr 08.01.2015, 19:21
  • 3
    @fersarr Здесь, Вы идете –  jw013 08.01.2015, 23:27
  • 4
    @bahamat, Который на самом деле не работает начиная с PID, может быть в поле 2 или 3 в зависимости от того, является ли задание одним из % + или % - или нет. Какой работы kill %${(k)^jobdirs}, который действительно длиннее; если необходимо перечислить PIDs затем, можно использовать еще дольше ${${jobstates#*:*:}%%=*}. –  Gilles 'SO- stop being evil' 28.01.2016, 12:06

Я предпочитаю проверять наличие заданий перед их уничтожением - так скрипт не завершится, если ничего не запущено.

Кроме того, так короче набирать текст. Закиньте это в свой .bash_profile:

function killjobs () {
    JOBS="$(jobs -p)";
    if [ -n "${JOBS}" ]; then;
        kill -KILL ${JOBS};
    fi
}

Затем выполните:

killjobs

Чтобы убить все запущенные задания.

3
27.01.2020, 19:32

Используйте xargs вместо подкоманды $ (jobs -p) , потому что, если jobs -p пусто, команда kill завершится ошибкой.

jobs -p | xargs kill
15
27.01.2020, 19:32

Думаю, в зависимости от того, что выдает результат 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
6
27.01.2020, 19:32

Похоже, что 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

-1
27.01.2020, 19:32

У меня есть несколько фоновых составных команд, которые я хочу корректно завершить, отправив SIGINT каждому процессу в macOS. Ни одно из других решений не работало должным образом, поэтому я придумал это:

jobs -p | xargs -n1 pkill -SIGINT -g

jobs -pперечисляет фоновые процессы, запущенные текущей оболочкой.

xargs -n1выполняет pkill один раз для каждого задания.

pkill -SIGINT -gотправляет SIGINT (так же, как ctrl+c )всем процессам в группе процессов.

1
27.01.2020, 19:32

Точка @pizdelect привела меня сюда. Задания, созданные с использованием каналов, имеют несколько pid. jobs -pсобирается предоставить только первый.

for j in $(jobs | awk '{gsub("[^0-9]","",$1);printf "%%%s\n", $1}');do kill $j;done

Если вы хотите получить их все, вы должны использовать идентификатор задания.

4
14.09.2020, 01:54

Принятый ответ @jw013 работает в большинстве ситуаций, за исключением случаев, когда задание имеет фоновые задания, поскольку убивается только лидер группы. (@pizdelect определил это ограничение в этом комментарии .)

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

Более того, кому-то может не хотетьсяkillStoppedрабочих мест, поэтому jobs -rможет оказаться полезным.

Объединив все эти элементы, мы получили решение, которое уничтожает все запущенные задания, включая фоновые:

for i in $(jobs -rp); do kill -- "-$i"; done

Вот решение, которое убивает все задания, включая фоновые:

for i in $(jobs -p); do kill -- "-$i"; done

0
06.11.2021, 03:42

Теги

Похожие вопросы