애플리케이션이 열린 후 터미널 창을 닫습니다.

애플리케이션이 열린 후 터미널 창을 닫습니다.

애플리케이션을 로드한 후 상위 터미널 창을 닫을 수 있나요?

제대로 작동하려면 권한을 사용하여 실행해야 하는 프로그램이 있습니다 . 현재 사용자가 있는지 확인하고 그렇지 않은 경우 앱을 로드하기 전에 비밀번호를 확인하도록 요청 root하는 스크립트 파일을 만들었습니다 .rootroot

원래

내 스크립트 파일의 내용은 다음과 같습니다.

#!/bin/bash
if [ "$EUID" -ne 0 ]
  then 
    echo "You need root privileges to run this utility"
    echo "Do you want to continue? (y/n):"
    read userInput
    
    if [ $userInput == "y" ] || [ $userInput == "Y" ]
      then 
        sudo ./myGuiProgram
      exit
    elif [ $userInput == "n" ] || [ $userInput == "N" ]
      then
        echo "Exiting now..." 
      exit 
    fi
  exit
elif [ "$EUID" -eq 0 ]
  then
    ./myGuiProgram 
  exit
fi

터미널 창을 닫는 대신 터미널 창을 닫도록 추가할 수 있는 것이 있습니까 myGuiProgram?

내 Centos 7 컴퓨터에는 차례로 실행되는 스크립트 파일을 실행하는 데스크톱 프로필이 있습니다.myGuiProgram

두 번째 시도

그 이후로 스크립트를 수정했지만 여전히 성공하지 못했습니다. 이 방법을 사용하면 프로그램을 닫지 않고 터미널 창을 수동으로 종료할 수 있습니다.

#!/bin/bash
if [ "$EUID" -ne 0 ]
  then 
    echo "You need root privileges to run this utility"
    echo "Do you want to continue? (y/n):"
    read userInput
    
    if [ $userInput == "y" ] || [ $userInput == "Y" ]
      then 
        sudo nohup ./myGuiProgram > /dev/null & disown && kill $PPID
    elif [ $userInput == "n" ] || [ $userInput == "N" ]
      then
        echo "Exiting now..."  
    fi
elif [ "$EUID" -eq 0 ]
  then
    nohup ./myGuiProgram > /dev/null & disown && kill $PPID
fi

MARco 작업 솔루션

@MARco 응답을 기반으로 한 새로운 변경 사항입니다. 이 방법은 매우 효과적입니다.

#!/bin/bash
if [ "$EUID" -ne 0 ]
  then 
    echo "You need root privileges to run this utility"
    echo "Do you want to continue? (y/n):"
    read userInput
    
    if [ $userInput == "y" ] || [ $userInput == "Y" ]
      then 
        sudo -b nohup ./myGuiProgram 2>&1> /dev/null
    elif [ $userInput == "n" ] || [ $userInput == "N" ]
      then
        echo "Exiting now..."
        sleep 1
        exit 0
    fi
elif [ "$EUID" -eq 0 ]
  then
    nohup ./myGuiProgram > /dev/null 2>&1> /dev/null & 
fi
kill $(ps -ho ppid -p $(ps -ho ppid -p $$))

답변1

일반적으로 GUI를 시작할 수 있습니다프로그램그리고 이를 시작한 xterm을 즉시 닫습니다.

exec프로그램&exit

또는 더 나은

exec프로그램2>&1>/dev/null &exit

터미널에서 입력을 받는 스크립트가 있으므로 터미널을 곧 종료할 필요가 없으므로 해결책은 다음과 같습니다.

  1. ./myGuiProgram사용. . . 교체nohup ./myGuiProgram 2>&1>/dev/null &
  2. sudo ./myGuiProgram사용. . . 교체nohup sudo ./myGuiProgram 2>&1>/dev/null &
  3. 스크립트에서 4개를 모두 제거합니다 exit(사용하는 방식이 중복될 뿐입니다).
  4. sleep 1스크립트 끝에 추가

터미널에서 스크립트 시작

exec script

참고: 외부 exec 함수 없이 스크립트를 시작하는 유일한 방법은 exec그다지 좋지 않습니다. script스크립트에서 xterm을 갑자기 종료하는 것입니다(xterm의 쉘 프로세스는 스크립트 해석기 pf bash의 상위인 명령의 상위를 허용합니다).

kill $(ps -ho ppid -p $(ps -ho ppid -p $$))

스크립트의 마지막 줄로

1.과 2.를 사용해야 한다는 생각도 들었습니다. nohup에는 프로그램의 출력을 무시하는 매개변수가 있어야 합니다. 그렇지 않으면 낭비되는 콘텐츠에 대한 확장 파이프만 추가하게 됩니다.

관련 정보