Команда 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