終端模擬器和 btsync 行為
我已經下載了 BitTorrent Sync 二進製文件。該程序只提供了一個 Web UI 界面。我正在嘗試使用終端模擬器為守護程序創建一個視窗,因為我不需要 always online
btsync
。當我執行時:cd ~/.btsync/; konsole -e "./btsync --nodaemon"
btsync
當我關閉 konsole 視窗點擊 X 按鈕時,守護程序退出。當我執行時:cd ~/.btsync/; uxterm -e "./btsync --nodaemon"
xterm
當我點擊視窗關閉按鈕時,視窗仍在執行。當我執行時:cd ~/.btsync/; urxvt -e "./btsync --nodaemon"
然後我關閉
rxvt
視窗,btsync
DAEMON STILL RUNS 在後台執行。我試圖用來
urxvt
為“守護程序視窗”分配一個圖示和一個標題,我唯一的解決方案是執行這個腳本:#!/bin/sh cd ~/.btsync/ echo BitTorrent Sync Web UI: http://127.0.0.1:8888/gui/en/index.html echo exec ~/.btsync/btsync --log ~/.btsync/sync.log --nodaemon
在文件中使用此命令行
.desktop
:Exec=/usr/bin/urxvt -fn "xft:Inconsolata" -icon ~/.btsync/btsync.png -iconic -title "BitTorrent Sync" -e btsync; /bin/kill $(cat ~/.btsync/.sync/sync.pid)
用於在視窗關閉
/bin/kill
時關閉守護程序。rxvt
我的問題是:有人知道為什麼konsole
,xterm
,rxvt
在這種情況下不具有相同的行為嗎?由於這個原因,我不能x-terminal-emulator
用來概括我的程式碼,而且我有多個客戶端使用不同的 Linux 桌面環境。
終端關閉時的退出是由以下兩種情況之一引起的:
- 在標準輸入上獲取 EOF
- 接收 SIGHUP
在我的測試中,xterm 和 konsole 都這樣做,所以不清楚為什麼行為會有所不同,除非你從最近的(雖然現在已修復)nVidia 錯誤中獲得隨機中斷的信號(請參閱升級後,標題欄中的 X 按鈕不再關閉xterm)。
你可以
nohup
用來確保既不退出。但是,我會注意到
-e
終端仿真器之間的語法不同。例如,konsole -e 'sleep 60'
將立即退出;xterm -e 'sleep 60'
將等待 60 秒。如果您刪除引號(將每個參數作為單獨的參數傳遞),它將在兩個終端中工作。$ konsole -e sleep 60 # works $ xterm -e sleep 60 # works $ konsole -e 'sleep 60' # FAILS $ xterm -e 'sleep 60' # works
嚴格來說,Debian Policy 說
x-terminal-emulator -e
必須像在 xterm 中那樣工作,但隨後指定了 xterm 在某一時刻的行為(在最後一種情況下它會失敗)……但是 xterm 改變了它的行為。請參閱Debian 錯誤 648271, 11.8.3 “提供終端仿真器的軟體包”說 xterm 將 -e 選項直接傳遞給 exec。因此,可能只是您使用
-e
錯誤;你應該這樣做:cd ~/.btsync/; konsole -e ./btsync --nodaemon
請注意缺少引號。