bash 명령 GUI가 열리지 않도록 방지

bash 명령 GUI가 열리지 않도록 방지

현재 .desktop 파일에서 필요한 모든 정보를 추출하려고 합니다.

다음 내용은 충분하지만 한 가지 단점이 있습니다.

때때로 .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를 사용하세요.

검색 결과 웹의 추천 조각 Xvfb(X Virtual Frame Buffer의 약자)는 Linux와 같은 UNIX 계열 운영 체제를 위한 인메모리 디스플레이 서버입니다. 스크린샷을 찍는 동시에 모니터 없이 그래픽 애플리케이션(예: CI 서버에서 브라우저 테스트)을 실행할 수 있습니다.

우분투 등을 설치합니다.

sudo apt-get install xvfb

다음을 사용하여 버퍼를 생성하려면:

Xvfb :100 &

그런 다음 디스플레이를 의사 디스플레이로 설정하십시오.

export DISPLAY=:100

해당 터미널 세션에서 실행하는 모든 항목은 이제 숨겨진 것으로 나타납니다.

관련 정보