現在、.desktopファイルから必要なすべての情報を抽出しようとしています。
次の内容は十分ですが、1つの欠点があります。
場合によっては、.desktopファイルのEXEC行が追加のプロセスを作成するため、後で終了できるように各ファイルを実行して予想されるプロセス名を取得する必要があります。
これまではうまくいきますが、時々GUIがしばらく点滅してからkillコマンドを実行した後に閉じることがあります。
私の質問は、すべての場合に機能する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を使用してください。
検索結果Webの推奨部分Xvfb(X Virtual Frame Bufferの略)は、LinuxなどのUNIXシリーズオペレーティングシステム用のインメモリディスプレイサーバーです。スクリーンショットを撮ると同時に、モニターなしでグラフィカルアプリケーション(CIサーバーでのブラウザテストなど)を実行できます。
Ubuntuなどを設置します。
sudo apt-get install xvfb
以下を使用してバッファを作成するには:
Xvfb :100 &
その後、ディスプレイを擬似ディスプレイに設定します。
export DISPLAY=:100
そのターミナルセッションで実行されているすべての項目は、非表示になっているように見えます。