Ах, неважно, я наконец нашел проблему - Atlassian добавили собственный сценарий оболочки Xvfb (/ usr / local / bin / Xvfb), который блокировал отправку сигнала. Для тех, у кого в будущем возникнет эта проблема, проверьте, выполняется ли Xvfb напрямую или через оболочку, и если это оболочка, это нарушит работу xvfb-run.
Вы должны использовать trap true 2
или trap : 2
вместо trap '' 2
. Вот что говорит об этом «help trap» в оболочке bash:
If ARG is the null string each SIGNAL_SPEC is ignored by the shell and by the commands it invokes.
Пример:
$ cat /tmp/test
#! /bin/sh
trap : INT
cat
echo first cat killed
cat
echo second cat killed
echo done
$ /tmp/test
<press control-C>
^Cfirst cat killed
<press control-C>
^Csecond cat killed
done
Когда вы используете Crtl + C , вы прерываете программу (" kill " it ).
То, что вы, вероятно, ищете, это приостановить вашу программу (" приостановить " ее ). Для этого можно использовать Crtl+Z.
Как только ваша программа будет приостановлена, вы можете увидеть ее, используя jobs
. Например:[1]+ Stopped ./foobar
Здесь у меня только одно задание, задание #1, но -их может быть больше одного, у каждого задания есть свой номер.
Вы можете управлять приостановленным процессом с помощью ряда команд, например bg
, fg
и kill
. bg %1
перезапустит задание #1 в b подтверждение g раунд fg %1
перезапустит задание #1 в раунде f ore g kill %1
убьет задание #1
Обратите внимание, что вы можете использовать bg
и fg
без аргументов, если у вас есть только одно активное задание.
Вы можете сбросить ловушку до значения по умолчанию, задав команду ловушки -
в качестве аргумента действия. Если вы сделаете это в подоболочке , это не повлияет на ловушку в родительской оболочке. В вашем скрипте вы можете сделать это для каждой команды, которую вам нужно прерывать с помощью Ctrl -C:
#!/bin/bash
# make the shell (and its children) ignore SIGINT
trap '' INT
.
.
.
# but this child won't ignore SIGINT
(trap - INT; my_program)
# the rest of the script is still ignoring SIGINT
.
.
.