Bash

關閉並重新啟動螢幕 - 最終被欺騙!

  • March 6, 2017
#!/bin/bash

set -o nounset
set -o errexit
trap 'echo "Aborting due to errexit on line $LINENO. Exit code: $?" >&2' ERR
set -o errtrace
set -o pipefail

SCR="bunny"
SCRIPT="/home/../run.sh" 



main() {
   if find_screen $SCR >/dev/null; then
       close_screen
       start_script
   fi
}

function start_script {
   echo "Starting script with new screen"
   screen -d -m -t $SCR sh $SCRIPT
}

function close_screen {
   if find_screen $SCR >/dev/null; then
       echo "Found! Deleting $SCR"
       screen -S -X $target_screen quit
   fi
}

function find_screen {
   if screen -ls "$1" | grep -o "^\s*[0-9]*\.$1[ "$'\t'"](" --color=NEVER -m 1 | grep -oh "[0-9]*\.$1" --color=NEVER -m 1 -q >/dev/null; then
       screen -ls "$1" | grep -o "^\s*[0-9]*\.$1[ "$'\t'"](" --color=NEVER -m 1 | grep -oh "[0-9]*\.$1" --color=NEVER -m 1 2>/dev/null
       return 0
   else
       echo "$1"
       return 1
   fi
}
target_screen=$(find_screen $SCR)
main "$@"

我正在嘗試創建一個重新啟動特定螢幕的腳本。現在,腳本確實啟動了螢幕,但它也創建了另一個帶有兩個點的螢幕1234..randomName

該腳本的目標是:

  • 檢查螢幕是否存在
  • 如果存在,關閉螢幕
  • SCRIPT使用名稱創建一個新的螢幕會話
  • 如果它不存在,仍然創建螢幕!

不知道發生了什麼或為什麼它不起作用。我究竟做錯了什麼?

我得到了這個與一些修改工作:

#!/bin/bash

set -o 名詞集
# 設置 -o 直立
# trap 'echo "由於 $LINENO 上的錯誤退出而中止。退出程式碼:$?" >&2' 錯誤
設置-o errtrace
設置-o pipefail

SCR="兔子"
腳本="/home/../run.sh"

功能主(){
如果 find_screen $SCR >/dev/null; 然後
關閉螢幕
啟動腳本
是
}

功能啟動腳本{
echo "用新螢幕啟動腳本"
螢幕 -d -m -S $SCR sh $SCRIPT
}

功能關閉螢幕{
如果 find_screen $SCR >/dev/null; 然後
echo "找到!正在刪除 $SCR"
螢幕 -S $target_screen -X 退出
是
}

功能查找螢幕{

結果=$(螢幕 -ls "$1" | grep -o "^\s*[0-9]*\.$1[ "$'\t'"](" --color=NEVER -m 1 | grep -哦 "[0-9]*\.$1" --color=NEVER -m 1)

如果 [ -z $result ]; 然後
迴聲“$ 1”
返回 1
別的
回顯$結果
返回 0
是
}
target_screen=$(find_screen $SCR)
主要“$@”
  • 我註釋掉了以下兩行:
豎起 
trap 'echo "由於 $LINENO 上的錯誤退出而中止。退出程式碼:$?" >&2' 錯誤 

這些行干擾了您return 1find_screen function

  • close_screen函式中,screen -S -X $target_screen quit需要稍作修改:screen -S $target_screen -X quit使開關與各自的參數相匹配。

函式中的if語句find_screen永遠不會返回 true,所以我通過添加一個results變數來稍微更新它,將它分配給您的原始測試條件。結果更新如下:

結果=$(螢幕 -ls "$1" | grep -o "^\s*[0-9]*\.$1[ "$'\t'"](" --color=NEVER -m 1 | grep -哦 "[0-9]*\.$1" --color=NEVER -m 1)

如果 [ -z $result ]; 然後
迴聲“$ 1”
返回 1
別的
回顯$結果
返回 0
是

其他項目

  • 如果您希望根據 $SCR 變數命名螢幕,則需要使用-S開關,如

screen -d -m -S $SCR

…並根據需要添加任何其他參數和開關。

  • 在該start_script函式中,您似乎正在嘗試使用-t開關,而不是-S

screen -d -m -t $SCR sh $SCRIPT根據您的描述,“使用 SCRIPT 名稱創建新的螢幕會話”您將用於-S設置螢幕會話名稱。您可以將其與-t設置視窗名稱結合使用,因為螢幕會話中可能有多個視窗:screen -d -m -S $SCR -tWindowName1

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