Linux

打開應用程序後關閉終端視窗

  • December 4, 2020

載入應用程序後是否可以關閉父終端視窗?

我有一個程序需要使用root特權執行才能正常工作,目前我製作了一個腳本文件,用於檢查使用者是否存在,root如果不是,則root在載入應用程序之前要求他們確認密碼。

原來的

這是我的腳本文件的內容:

#!/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 $$))

一般來說,您可以啟動一個 gui程序並立即關閉啟動它的 xterm:

exec 程序&exit

或更好

exec 程序2>&1>/dev/null &exit

您有一個仍在終端中獲取輸入的腳本,因此您的終端不必很快退出,所以這是解決方案:

  1. 替換./myGuiProgramnohup ./myGuiProgram 2>&1>/dev/null &
  2. 替換sudo ./myGuiProgramnohup sudo ./myGuiProgram 2>&1>/dev/null &
  3. 刪除腳本中的所有四個exit(您使用它的方式只是多餘的)
  4. 附加sleep 1在腳本的末尾

在終端中啟動腳本

exec script

注意:在腳本中沒有外部 exec 功能並在腳本中具有外部 exec 功能的唯一方法exec不是很好:在腳本中突然結束 xterm(xterm 的 shell 程序的父程序接受script命令,它是腳本解釋器的父 pf bash)

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

作為腳本的最後一行

使用 1. 和 2. 的需要也給了我一個想法:nohup 應該有一個參數來忽略程序的輸出,因為否則它只會為浪費的內容添加一個廣泛的管道

引用自:https://unix.stackexchange.com/questions/622697