Как вы заканчиваете все процессы, вызываемые файлом оболочки

Bash поддерживает некоторый синтаксис C-стиля. Например:

Объявления / определения функций синтаксически похожи на объявления / определения функций в C, за исключением того, что вы не определяете ни параметры (которые извлекаются с использованием позиционных параметров $1, $2, [ f14], ...) и типы возврата (Bash вообще не использует типы):
foo() {
    # ...
}
Или снова аналогично C с использованием встроенного объявления / определения:
foo() { #...; }
Следует отметить, что при использовании встроенного объявления / определения первый и последний оператор должны быть разделены пробелами между { и } соответственно и что (опять же аналогично C) каждый оператор должен быть разделен точкой с запятой от других и что окончательный оператор должен заканчиваться точкой с запятой:
foo() { command1; command2; command3; }
Для полноты альтернативного способа объявления / определения функции используется ключевое слово function, которое не нуждается в () после имени функции:
function foo {
    #...
}
Вы можете оценить выражение C-стиля, включив их в двойная скобка (()): поддерживается множество операторов C-стиля (включая назначение), например: =, >, >=, ==, !=, <, <=, &&, ||, !, среди прочего:
$ i=0
$ j=1
$ ((i > j)) && echo True
$ ((i >= j)) && echo True
$ ((i == j)) && echo True
$ ((i != j)) && echo True
True
$ ((i < j)) && echo True
True
$ ((i <= j)) && echo True
True
$ ((i && j)) && echo True
$ ((i || j)) && echo True
True
$ ((\! i)) && echo True
True
$ ((\! j)) && echo True
$ ((i = j))
$ echo $i
1
$ echo $j
1
оценки выражений C-стиля можно использовать в сочетании с операторами if, while и until:
if((i == 0)); then
    # ...
done
while((i == 0)); do
    # ...
done
until((i == 0)); do
    # ...
done
. В частности, (()) также позволяет писать C-стиль for условия цикла:
for((i = 0; i < 3; i++)); do
    # ...
done
Оценка выражений в стиле C не поддерживает присвоение результата оценки; для этого вы можете использовать арифметическое расширение ($(())), которое допускает какое-то назначение выражений в стиле C:
$ i=0
$ j=1
$ k=$((i > j))
$ echo $k
0
$ k=$((i < j))
$ echo $k
1
$ x=$((1 + 2 + 3))
$ echo $x
6
Поддерживаются также операции с приращением / уменьшением числа в стиле C / style / postfixed:
++i
i++
--i
i--
2
задан 1 December 2017 в 12:14

2 ответа

Если pstree $(pgrep a) перечисляет все потоковые процессы a, вы можете отправить SIGTERM всем из них (includesig a.sh) с помощью:

kill $(pstree -p $(pgrep "a.sh") | awk -F"[)(]" '{for(i=2;i<=NF;i+=2)print $i}')

Если это не так, ни kill -$(pgrep a) (обратите внимание на -), ни pkill -P $(pgrep a) могут помочь, я предлагаю вам добавить строку в начало скриптов и добавить ее PID в один файл следующим образом:

echo $$ >>/path/to/the/pidfile

Таким образом, у вас всегда есть список PID, доступных для убийства простым:

kill </path/to/the/pidfile
2
ответ дан 18 July 2018 в 02:16

Если pstree $(pgrep a) перечисляет все потоковые процессы a, вы можете отправить SIGTERM всем из них (includesig a.sh) с помощью:

kill $(pstree -p $(pgrep "a.sh") | awk -F"[)(]" '{for(i=2;i<=NF;i+=2)print $i}')

Если это не так, ни kill -$(pgrep a) (обратите внимание на -), ни pkill -P $(pgrep a) могут помочь, я предлагаю вам добавить строку в начало скриптов и добавить ее PID в один файл следующим образом:

echo $$ >>/path/to/the/pidfile

Таким образом, у вас всегда есть список PID, доступных для убийства простым:

kill </path/to/the/pidfile
2
ответ дан 24 July 2018 в 17:31
  • 1
    Да, это было то, что я должен был сделать. Я хотел получить более "bash" но, к сожалению, нищие не могут быть выбраны :( – John Lexus 6 December 2017 в 01:37

Другие вопросы по тегам:

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