Команда Virsh зависает, когда скрипт работает в фоновом режиме

У меня есть скрипт bash, который работает как cronjob. Этот скрипт запускает несколько команд, одна из них — следующая команда virsh:

      /usr/bin/virsh list --all

Когда я запускаю этот сценарий в терминале (от имени пользователя root) или в качестве задания cron (также от имени пользователя root), команда virsh работает должным образом и выводит список всех виртуальных машин.

Во время тестирования и отладки этого скрипта я заметил, что если я отправляю скрипт в фоновый режим или отправляю его в фоновый режим, а затем отключаю его, скрипт зависает на неопределенный срок по команде virsh. Ниже я привожу некоторые подробности.

Чтобы проиллюстрировать проблему, давайте предположим простой скрипт «test.bash»:

      [root@kvm-host]# cat test.bash
#!/bin/bash

/usr/bin/virsh list --all

Когда я запускаю скрипт test.bash на переднем плане, он работает как положено:

      [root@kvm-host]# bash -x test.bash
+ /usr/bin/virsh list --all
 Id   Name                    State
----------------------------------------
 27   slave1                  running
 29   ubuntu_discourse        running
 30   osticket                running
 31   lubuntu_desktop         running
 -    slave2                  shut off

Когда я запускаю скрипт test.bash в фоновом режиме, он зависает на неопределенный срок по команде virsh:

      [root@kvm-host]# bash test.bash 2>stderr &
[1] 1119722
[root@kvm-host]# ps aux | grep virsh | grep -v grep
root     1119723  0.0  0.0 442660 16012 pts/4    Tl   17:07   0:00 /usr/bin/virsh list --all

[1]+  Stopped                 bash test.bash 2> stderr

Если я отправлю скрипт в фон и откажусь от него, то скрипт тоже зависнет по команде virsh:

      [root@kvm-host]# bash -x test.bash 2>stderr & disown
[1] 1119502
[root@kvm-host]# ps aux | grep virsh | grep -v grep
root     1119503  0.0  0.0 442656 15956 pts/4    Tl   17:05   0:00 /usr/bin/virsh list --all

Я попробовал запустить команду virsh с параметром -c qemu:///system , и поведение было таким же, когда я отправил сценарий test.bash в фоновый режим. Как вы можете видеть выше, я также пробовал запустить скрипт без «bash -x». Я также попробовал запустить сценарий, перенаправляющий stderr и stdout на /dev/null. Наконец, я также попробовал запустить сценарий без перенаправления stderr или stdout в какой-либо файл. Проблема во всех этих случаях одна и та же.

Можно ли запустить команду virsh в фоновом режиме, как описано? Любые комментарии будут высоко оценены. Спасибо!

Вот некоторые подробности о моей системе:

      [root@kvm-host]# cat /etc/redhat-release
Rocky Linux release 8.6 (Green Obsidian)

[root@kvm-host]# virsh -V
Virsh command line tool of libvirt 8.0.0
See web site at https://libvirt.org/

Compiled with support for:
 Hypervisors: QEMU/KVM ESX Test
 Networking: Remote Network Bridging Interface netcf Nwfilter
 Storage: Dir Disk Filesystem SCSI Multipath iSCSI LVM RBD Gluster
 Miscellaneous: Daemon Nodedev SELinux Secrets Debug DTrace Readline

2 ответа

Я предполагаю, что это происходит из-за пкттяжагента.

Этот пример показывает, как процесс зависает в фоновом режиме:

      # virsh list &
[1] 2121077

#
[1]+  Stopped                 virsh list

# ps f
2039251 pts/11   S      0:00      \_ -bash
2121077 pts/11   Tl     0:00          \_ virsh list
2121079 pts/11   Tl     0:00          |   \_ /usr/bin/pkttyagent --process 2121077 --notify-fd 4 --fallback
2121760 pts/11   R+     0:00          \_ ps f

Если процесс снова переводится на передний план, он завершается:

      # fg
virsh list
 Id   Name       State
--------------------------
 2    docker     running
 3    test       running

#

Я обнаружил следующую нерешенную проблему: https://bugzilla.redhat.com/show_bug.cgi?id=1726714, в которой описывается, что это происходит из-за сигнала SIGTTOU. Описание этого сигнала можно найти здесь: https://www.gnu.org/software/libc/manual/html_node/Job-Control-Signals.html .

Есть причина, по которой это сложно, но с этим следует обращаться правильно. Я разместил исправление здесь:

https://gitlab.freedesktop.org/polkit/polkit/-/merge_requests/139

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