bashコマンドGUIが開かないようにする

bashコマンドGUIが開かないようにする

現在、.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

そのターミナルセッションで実行されているすべての項目は、非表示になっているように見えます。

おすすめ記事