linux xvfb run,bash – 如何正确终止xvfb-run

在Docker容器中使用karma和xvfb-run进行JavaScript单元测试时,遇到一个问题,即在测试完成后,如何正确关闭由xvfb-run启动的Firefox进程。目前的解决方案是在脚本中设置陷阱来杀死Firefox,但这会终止所有Firefox实例,而非仅关闭由脚本启动的那个。手动检查xvfb-run启动的进程,发现当终止xvfb-run进程时,其子进程并未关闭。寻找一个优雅的方法来终止xvfb-run,以确保正确清理所有相关进程。

为了在docker容器中使用

karma执行一些JavaScript单元测试(基于ubuntu 14.04),我使用

karma-script-launcher和xvfb-run在容器中启动firefox.启动脚本如下所示:

#!/bin/bash

set -o errexit

# nasty workaround as xvfb-run doesn't cleanup properly...

trap "pkill -f /usr/lib/firefox/firefox" EXIT

xvfb-run --auto-servernum --server-args='-screen 0, 1024x768x16' firefox $1

启动浏览器并执行单元测试非常有效.在执行测试后,karma终止了生成的浏览器实例 – 在我的例子中是通过xvfb-run启动firefox的脚本.

在上面的脚本中,您可以看到我在脚本退出时注册了一个陷阱来杀死已启动的firefox.这是有效的,但脚本不是一个非常好的公民,因为它终止当前正在运行的所有firefox实例,而不是仅仅终止脚本启动的一个实例.我首先试图杀死xfvb-run进程但是杀死这个进程对xvfb-run脚本启动的子进程没有影响…

如果我通过xvfb-run手动启动firefox,则会产生一堆生成的进程:

root@1d7a5988e521:/data# xvfb-run --auto-servernum --server-args='-screen 0, 1024x768x16' firefox &

[1] 348

root@1d7a5988e521:/data# ps ax

PID TTY STAT TIME COMMAND

1 ? Ss 0:00 bash

348 ? S 0:00 /bin/sh /usr/bin/xvfb-run --auto-servernum --server-args=-screen 0, 1024x768x16 firefox

360 ? S 0:00 Xvfb :99 -screen 0, 1024x768x16 -nolisten tcp -auth /tmp/xvfb-run.bgMEuq/Xauthority

361 ? Sl 0:00 /usr/lib/firefox/firefox

378 ? S 0:00 dbus-launch --autolaunch bcf665e095759bae9fc1929b57455cad --binary-syntax --close-stderr

379 ? Ss 0:00 //bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session

388 ? S 0:00 /usr/lib/x86_64-linux-gnu/gconf/gconfd-2

414 ? R+ 0:00 ps ax

root@1d7a5988e521:/data#

如果我现在终止xvfb-run进程(PID 348),则只会终止此进程,而其他进程将继续运行.如果我取消了firefox进程(PID 361),xvfb-run脚本也会正确终止并杀死其他进程.但是从我的脚本中我只知道xvfb运行进程的PID …

在我的研究期间,我偶然发现了this rather old bug report的xvfb-run,尽管这个bug的状态在2012年得到了修复,但它似乎仍然有效.

有没有礼貌的方法来终止xvfb运行进程,以便正确清理其他进程?

[root@yfw ~]# cd /opt/openfire/enterprise/spark/Spark [root@yfw Spark]# # 1. 创建提取目录 [root@yfw Spark]# cd /tmp [root@yfw tmp]# mkdir -p xvfb-extract && cd xvfb-extract [root@yfw xvfb-extract]# rm -rf * [root@yfw xvfb-extract]# [root@yfw xvfb-extract]# # 2. 解压 RPM 内容到当前目录 [root@yfw xvfb-extract]# rpm2cpio ../xorg-x11-server-Xvfb-1.20.11-2.el8.x86_64.rpm | cpio -idmv ./usr/bin/Xvfb ./usr/bin/xvfb-run ./usr/lib/.build-id ./usr/lib/.build-id/90 ./usr/lib/.build-id/90/ef040f79a6dc2a63bd97c6f8615551a9918520 ./usr/share/man/man1/Xvfb.1.gz 4104 blocks [root@yfw xvfb-extract]# [root@yfw xvfb-extract]# # 3. 查看是否成功提取出 Xvfb [root@yfw xvfb-extract]# ls -l usr/bin/Xvfb -rwxr-xr-x 1 root root 2091144 Jun 11 2021 usr/bin/Xvfb [root@yfw xvfb-extract]# # 输出应类似: [root@yfw xvfb-extract]# # -rwxr-xr-x 1 root root 298808 Jan 1 2021 usr/bin/Xvfb [root@yfw xvfb-extract]# [root@yfw xvfb-extract]# # 4. 复制到 openfire 用户 bin 目录 [root@yfw xvfb-extract]# su - openfire -c 'mkdir -p ~/bin' This account is currently not available. [root@yfw xvfb-extract]# cp usr/bin/Xvfb /home/openfire/bin/ cp: cannot create regular file '/home/openfire/bin/': Not a directory [root@yfw xvfb-extract]# chown openfire:openfire /home/openfire/bin/Xvfb chown: cannot access '/home/openfire/bin/Xvfb': No such file or directory [root@yfw xvfb-extract]# chmod +x /home/openfire/bin/Xvfb chmod: cannot access '/home/openfire/bin/Xvfb': No such file or directory [root@yfw xvfb-extract]# [root@yfw xvfb-extract]# # 5. 验证可执行性 [root@yfw xvfb-extract]# su - openfire -s /bin/bash -c 'which Xvfb; Xvfb -help | head -5' /usr/bin/which: no Xvfb in (/usr/local/ffmpeg/bin:/opt/spark/bin:=en_US.UTF-8:/usr/local/ffmpeg/bin) -bash: head: command not found -bash: Xvfb: command not found [root@yfw xvfb-extract]#
最新发布
10-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值