Вы можете использовать exiftool
для управления данными EXIF в различных форматах файлов. Это perl-библиотека, сопровождаемая утилитой командной строки:
$ exiftool test.jpg | grep -i resolution
X Resolution : 72
Y Resolution : 72
Resolution Unit : inches
Focal Plane X Resolution : 3959.322034
Focal Plane Y Resolution : 3959.322034
Focal Plane Resolution Unit : inches
В этом примере данные EXIF говорят, что test.jpg
имеет разрешение 72 × 72 dpi. Чтобы обновить эти значения, например, до 100 × 100, exiftool
должен быть вызван следующим образом:
$ exiftool -XResolution=100 -YResolution=100 test.jpg
1 image files updated
И вуаля:
$ exiftool test.jpg | grep -i resolution
X Resolution : 100
Y Resolution : 100
Resolution Unit : inches
Focal Plane X Resolution : 3959.322034
Focal Plane Y Resolution : 3959.322034
Focal Plane Resolution Unit : inches
тл;др; процесс Xvfb
устанавливает обработчик сигнала для SIGINT
и завершает работу, когда получает такой сигнал, но процесс sleep
этого не делает, поэтому он наследует состояние «игнорировать» для SIGINT
, как это было устанавливается оболочкой, выполняющей сценарий перед выполнением двоичного файла sleep
.
Когда запускается сценарий оболочки, управление заданиями отключается, а фоновые процессы (, запущенные с помощью &
), просто запускаются в той же группе процессов, при этом SIGINT
и SIGQUIT
устанавливаются вSIG_IGN
(игнорируются )и их стандартный ввод перенаправляется с /dev/null
.
If job control is disabled (see the description of set -m) when the shell executes an asynchronous list, the commands in the list shall inherit from the shell a signal action of ignored (SIG_IGN) for the SIGINT and SIGQUIT signals.
Если расположение сигнала установлено наSIG_IGN
(игнорировать ), это состояние будет унаследовано через fork()
и execve()
:
Signals set to the default action (SIG_DFL) in the calling process image shall be set to the default action in the new process image. Except for SIGCHLD, signals set to be ignored (SIG_IGN) by the calling process image shall be set to be ignored by the new process image.
Bash не пересылает такие сигналы, как SIGINT или SIGTERM, процессам, которых он в данный момент ожидает.
Одним из распространенных обходных путей является ожидание прерывания, как показано в следующем примере.:
int_handler()
{
kill -TERM "${child_pid}" > /dev/null 2>&1
}
trap 'int_handler' INT
echo "Sleeping... "
sleep 200 &
child_pid=$!
wait ${child_pid} > /dev/null 2>&1
trap - INT
wait ${child_pid} > /dev/null 2>&1