題 如何從命令行啟動GUI linux程序,但是與命令行分開?


我之前搜索過這個,但從來沒有找到答案。

在Windows中,如果我打開了控制台窗口,請鍵入 winmine,按回車鍵,將出現掃雷,完全與cmd程序分開。除了Minesweeper的父設置為命令提示符的那個實例之外,Minesweeper實例沒有以我知道的任何方式綁定到命令提示符。然而,它在Linux中有所不同。

在Linux中,如果我打開控制台窗口,請鍵入 emacs 然後按Enter鍵,Emacs將打開,但它似乎與命令行綁定。具體來說,似乎我不能再使用命令行,直到關閉Emacs實例。有沒有辦法在Linux中復制Windows行為?

謝謝!


86
2017-08-18 03:22


起源


重複:superuser.com/questions/178587/... - behrooz
請給geekosaur答案。 - Joshua Robison
在windows7中它是minesweeper.exe這裡C:\ Program Files \ Microsoft Games \ Minesweeper所以minesweeper.exe一般不會工作..因為該目錄不在路徑中..無論如何,你應該說明windows版本 - barlop


答案:


bashdetach 是一個內置的,使用如下:

emacs &
detach %+ # or % + the number in brackets printed after the above

zsh,您可以在一次操作中進行背景和分離:

emacs &|

9
2018-03-04 00:33





附加 & 到命令行:

emacs &

這將把emacs放在後台,讓您繼續使用終端。

請注意,這仍然會將emacs作為終端的子進程,當您退出終端時,它也將退出emacs。要避免這種情況,請鍵入:

(emacs &)

括號告訴終端從終端分離emacs進程。

仍然,程序中的stdout和stderr消息將顯示在終端上。為防止這種情況,請使用:

(emacs &> /dev/null &)

105
2017-08-18 03:25



這正是我想要的。謝謝!
我特別喜歡(emacs&)提示。
如果你已經啟動了任務(emancs),那麼使用CTRL-Z進入睡眠狀態,然後使用命令“bg”發送到後台。 - Jayan
@StackTrace:如果你這樣做,並關閉終端,它也會殺死emacs。 - Nathan Fellman
好的..我曾經使用“nohup”分離這個。一旦進程啟動就無法完成...... - Jayan


使用 nohup。 像這樣: nohup amarok &

希望這可以幫助。


19
2017-08-18 03:26





我已經發布 一個答案 從各種來源的答案到類似主題的舊線程。以下是適用於此主題的答案的副本。


以下作品:

$ (gui_app &> /dev/null &)

這是Nathan Fellman的回答加上重定向。

“&> / dev / null”將stdout和stderr重定向到空設備。最後一個&符號使進程在後台運行。命令周圍的括號將使您的“gui_app”在子shell中運行。

執行此操作將從執行此命令的控制台中分離“gui_app”進程。因此,即使您關閉窗口父終端模擬器正在運行,“gui_app”也不會關閉。我運行它然後用“pstree”命令查看進程樹,發現以這種方式啟動的應用程序將成為子進程“init”。

例如,

$ gui_app &> /dev/null &

將在後台運行該應用程序,但它將成為控制台進程的子進程,並將在您關閉終端時終止。 (雖然通過使用exit命令或Ctrl-D通過bash退出終端,但是通過將後台進程交給init來讓bash清理。)

“nohup”可以像NawaMan所建議的那樣工作,但默認情況下會將輸出和錯誤重定向到文件。正如JeffG回答的那樣,“disown”命令(如果在shell中可用)可以在您啟動後台進程後從終端分離進程:

$ gui_app &
$ disown

(BTW所有這些都適用於bash。我確定其他shell有其他方法/語法來執行此操作。)

一些參考: Disowning Processes(UNIX電動工具)

如果它是對GUI應用程序的簡單調用 - 沒有復雜的選項等 - 它似乎使用像“gmrun”這樣的啟動器或者 dmenu (警告:響亮的音頻)也是一個不錯的選擇。將它綁定到一個組合鍵。我還沒有使用發射器,但嘗試了這兩個。

注意:CarlF中 另一個帖子的評論 報告通過“gui_app&”方法啟動的GUI應用程序在從父終端退出時不會關閉。我認為我們以不同的方式關閉終端。我正在關閉終端模擬器運行的窗口。我想他可能已經通過shell退出終端模擬器(退出命令或Ctrl-D)。我測試了這一點,看到通過bash退出並沒有停止GUI作為終端的後台進程開始,如CarlF所說。當它有機會清理時,它似乎會將後台進程轉發給init。實際上,這必須是子shell中後台進程切換到init的機制。


18
2018-04-03 21:19





util-linux包含一個名為setsid的工具,它基本上做了分離工作:

$ setsid someprogram

這將運行 someprogram 在一個新的會議中。


10
2018-05-12 10:06





嘗試輸入 xemacs & 在後台打開XEmacs。

請不要將其稱為“模擬Windows行為”。哎喲。

你也可以:

  • 打開一個新終端
  • 使用Alt + F2或窗口管理器啟動程序,而不是使用終端
  • 使用GNU Screen

9
2017-08-18 03:24





我將以下代碼放在一個名為“sbg”的可執行腳本文件中,用於“靜默背景”。它完成了從shell開始完全斷開正在啟動的程序的所有必要事項:從/向重定向stdin,stdout和stderr /dev/null,忽略掛斷,在後台運行和分離。

#!/bin/bash
nohup "$@" &>/dev/null & disown %%

那你就可以做到 sbg emacs。您還可以傳遞任何您想要的參數: sbg emacs --daemon FILE1 FILE2


7
2018-04-05 07:11



腳本解決方案最適合我。謝謝!!雖然我用過 (gui_app &> /dev/null &) 相反(@ EMPraptor的答案) - Jimi Oke


command &

命令後放一個&符號。


3
2017-08-18 03:25





如果您使用bash,則可以拒絕該過程:

% firefox &
% disown 

3
2018-03-04 00:16





你可以使用這一行:

$ emacs & disown

2
2017-08-06 03:29