我目前正在尝试从 .desktop 文件中提取我需要的所有信息。
下面的内容已经足够好了,但有一个缺点。
因为有时 .desktop 文件中的 EXEC 行会生成额外的进程,所以我必须运行每个文件才能获取预期的进程名称,因为这样我就可以稍后终止它。
目前来说这很好,但有时 GUI 会闪烁一秒钟,然后在我发出终止命令后关闭。
我的问题是,有没有一种简单的方法可以在没有 GUI 的情况下运行命令,并且适用于所有情况。
有没有办法在完全隐藏 GUI 的同时运行命令?
我的剧本
#!/bin/bash
for filename in /usr/share/applications/*.desktop /var/lib/snapd/desktop/applications/*.desktop; do
#try and get command line
CMD=$(grep -Po "(?<=^Exec=).+\s" "$filename" | tail -1)
$CMD &>/dev/null &
PID="$!"
#if no pid or comand found try another approach
if [[ -z "$CMD" ]] || [[ -z "$PID" ]]
then
CMD=$(grep '^Exec=' "$filename" | tail -1 | sed 's/^Exec=//')
$CMD &>/dev/null &
PID="$!"
if [[ -z "$CMD" ]] || [[ -z "$PID" ]]
then
# if nothing then skip --- TODO fix this
continue
fi
fi
name=$(ps --no-header $PID | awk '{print $5}')
if [[ -z "$name" ]]
then
:
#echo $CMD
#echo $filename has no name
else
#extract the categories from the file
categories=$(grep '^Categories' "$filename" | tail -1 | sed 's/^Categories=//' | sed 's/%.//' | sed 's/^"//g' | sed 's/" *$//g')
#get icon location
icon=$(grep '^Icon' "$filename" | tail -1 | sed 's/^Icon=//' | sed 's/%.//' | sed 's/^"//g' | sed 's/" *$//g')
if [[ $icon == /* ]]
then
icons=$icon
else
icons=$(find "/usr/share/icons/" -name "*$icon.*")
fi
#get icon file paths
echo {"pid":$PID, "name":$name, "filename":$filename, "cmd":$CMD, "categories":$categories, "icons":$icons}
fi
kill -SIGTERM $PID &>/dev/null
#echo KILLING
done
答案1
我找到了解决方案 - 不确定是否有更好的方法但是
使用 xvfb,它是一个虚拟帧缓冲区。
搜索结果 来自网络的精选片段 Xvfb(X 虚拟帧缓冲区的缩写)是用于类 UNIX 操作系统(例如 Linux)的内存中显示服务器。它使您能够在没有显示器的情况下运行图形应用程序(例如,CI 服务器上的浏览器测试),同时还能够截取屏幕截图。
安装ubuntu等
sudo apt-get install xvfb
要使用...创建缓冲区:
Xvfb :100 &
然后将显示设置为伪显示
export DISPLAY=:100
您在该终端会话中运行的所有内容现在都显示为隐藏运行。