Làm cách nào để khởi động chương trình GUI linux từ dòng lệnh, nhưng tách biệt với dòng lệnh?


89

Tôi đã tìm kiếm điều này trước đây, nhưng chưa bao giờ có thể tìm thấy câu trả lời.

Trong Windows, nếu tôi mở cửa sổ giao diện điều khiển, nhập winminevà nhấn enter, Minesweeper sẽ xuất hiện, tách biệt hoàn toàn với chương trình cmd. Ví dụ Minesweeper không bị ràng buộc với dấu nhắc lệnh theo bất kỳ cách nào tôi biết, ngoại trừ cha mẹ của Minesweeper được đặt thành phiên bản đó của dấu nhắc lệnh. Nó khác với Linux, tuy nhiên.

Trong Linux, nếu tôi mở cửa sổ giao diện điều khiển, gõ emacsvà nhấn enter, Emacs sẽ mở, nhưng dường như nó được gắn với dòng lệnh. Cụ thể, có vẻ như tôi không thể sử dụng dòng lệnh nữa cho đến khi phiên bản Emacs đó bị đóng. Có cách nào để sao chép hành vi của Windows trong Linux không?

Cảm ơn!



xin vui lòng đưa ra câu trả lời cho geekizard.
Joshua Robison

trong windows7 nó minesweeper.exe đây C: \ Program Files \ Microsoft Games \ Minesweeper nên minesweeper.exe sẽ không thường làm việc .. như thư mục đó không có trong con đường .. Và dù sao đi nữa, bạn nên nói rõ phiên bản cửa sổ
barlop

Câu trả lời:


10

Trong bash, detachlà một tích hợp, được sử dụng như sau:

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

Trong zsh, bạn có thể nền và tách ra trong một hoạt động:

emacs &|

108

Nối &vào dòng lệnh:

emacs &

Điều này sẽ đặt emacs trong nền và cho phép bạn tiếp tục sử dụng thiết bị đầu cuối của mình.

Lưu ý rằng điều này vẫn sẽ để lại các emacs như là một quy trình phụ của thiết bị đầu cuối của bạn và khi bạn thoát khỏi thiết bị đầu cuối, nó cũng sẽ thoát các emacs. Để tránh điều này, gõ:

(emacs &)

Các dấu ngoặc đơn nói với thiết bị đầu cuối tách quá trình emacs khỏi thiết bị đầu cuối.

Tuy nhiên, thông báo stdout và stderr từ chương trình sẽ hiển thị trên thiết bị đầu cuối. Để ngăn chặn điều này, hãy sử dụng:

(emacs &> /dev/null &)

9
Tôi đặc biệt thích mẹo (emacs &).

1
nếu bạn đã bắt đầu tác vụ (emancs), sau đó sử dụng CTRL-Z để đặt chế độ ngủ và sau đó sử dụng lệnh "bg" để gửi đến nền.
Jayan

@StackTrace: nếu bạn làm điều đó và bạn đóng thiết bị đầu cuối của mình, nó cũng sẽ giết chết emacs.
Nathan Fellman

1
OK .. Tôi đã từng sử dụng "nohup" tách cái này ra. Không thể thực hiện được khi quá trình được bắt đầu ...
Jayan

Khi nhấn Ctrl+ Ctrong cửa sổ đầu cuối, lệnh này được ban hành, quá trình này sẽ bị hủy: <
Richard de Wit

21

Sử dụng nohup. Như thế này:nohup amarok &

Hi vọng điêu nay co ich.


19

Tôi đã đăng một câu trả lời cho một chủ đề cũ hơn của chủ đề tương tự với câu trả lời từ nhiều nguồn khác nhau. Sau đây là một bản sao của câu trả lời thích nghi cho chủ đề này.


Các tác phẩm sau:

$ (gui_app &> /dev/null &)

Đây là câu trả lời của Nathan Fellman cộng với chuyển hướng.

"&> / dev / null" chuyển hướng cả thiết bị xuất chuẩn và thiết bị xuất chuẩn sang thiết bị null. Dấu và cuối cùng làm cho quá trình chạy trong nền. Các dấu ngoặc đơn xung quanh lệnh sẽ khiến "gui_app" của bạn chạy trong một khung con.

Làm điều này sẽ tách quá trình "gui_app" khỏi bàn điều khiển mà bạn thực hiện lệnh này từ đó. Vì vậy, ngay cả khi bạn đóng trình giả lập thiết bị đầu cuối cha mẹ đang chạy, "gui_app" sẽ không đóng. Tôi đã chạy nó sau đó nhìn vào cây quy trình bằng lệnh "pstree" và thấy một ứng dụng bắt đầu theo cách này sẽ trở thành tiến trình con thành "init".

Ví dụ,

$ gui_app &> /dev/null &

sẽ chạy ứng dụng trong nền, nhưng nó sẽ trở thành một tiến trình con của tiến trình giao diện điều khiển và sẽ chấm dứt khi bạn đóng thiết bị đầu cuối. (Mặc dù thoát khỏi thiết bị đầu cuối thông qua bash bằng cách sử dụng lệnh exit hoặc Ctrl-D sẽ cho phép bash dọn sạch bằng cách chuyển quá trình nền cho init.)

"nohup" hoạt động như NawaMan đã đề xuất, nhưng điều đó chuyển hướng đầu ra & lỗi sang một tệp theo mặc định. Như JeffG đã trả lời, lệnh "disown" (nếu có sẵn trong shell) có thể tách quy trình khỏi thiết bị đầu cuối sau khi bạn bắt đầu một quy trình nền:

$ gui_app &
$ disown

(BTW tất cả những điều này áp dụng cho bash. Tôi chắc chắn các shell khác có các phương thức / cú pháp khác để làm điều này.)

Một số tài liệu tham khảo: Quy trình từ chối (Công cụ điện UNIX)

Nếu đó là một cuộc gọi đơn giản đến một ứng dụng GUI - không có các tùy chọn phức tạp và như vậy - thì có vẻ như sử dụng trình khởi chạy như "gmrun" hoặc dmenu (cảnh báo: âm thanh lớn) cũng là một lựa chọn tốt. Liên kết nó với một sự kết hợp quan trọng. Tôi chưa sử dụng launcher nhưng đã thử hai cái đó.

LƯU Ý: CarlF trong các nhận xét của các luồng khác báo cáo các ứng dụng GUI được khởi động thông qua phương thức "gui_app &" không đóng khi anh ta thoát khỏi thiết bị đầu cuối cha mẹ. Tôi nghĩ rằng chúng tôi đã đóng thiết bị đầu cuối theo những cách khác nhau. Tôi đã đóng cửa sổ trình giả lập thiết bị đầu cuối đang chạy. Tôi nghĩ rằng anh ta có thể đã thoát khỏi trình giả lập thiết bị đầu cuối thông qua trình bao (lệnh exit hoặc Ctrl-D). Tôi đã thử nghiệm điều này và thấy rằng việc thoát qua bash không dừng GUI bắt đầu như quá trình nền của thiết bị đầu cuối như CarlF nói. Có vẻ như bash bỏ các quá trình nền để khởi tạo khi nó có cơ hội để làm sạch. Trong thực tế, đây phải là cơ chế mà quá trình nền bắt đầu trong một lớp con được chuyển sang init.


11

produc-linux bao gồm một công cụ có tên là setsid, về cơ bản thực hiện những gì tách ra:

$ setsid someprogram

Điều này sẽ chạy someprogramtrong một phiên mới.


9

Hãy thử gõ xemacs &để mở XEmac trong nền.

Vui lòng không coi đây là "mô phỏng hành vi của Windows". Ôi.

Bạn cũng có thể:

  • Mở một thiết bị đầu cuối mới
  • Sử dụng Alt + F2 hoặc trình quản lý cửa sổ của bạn để khởi chạy chương trình, thay vì sử dụng thiết bị đầu cuối
  • Sử dụng màn hình GNU

7

Tôi đặt đoạn mã sau vào tệp tập lệnh thực thi có tên "sbg" cho "nền im lặng". Nó thực hiện tất cả những điều cần thiết để ngắt kết nối hoàn toàn chương trình đang được khởi động từ trình bao: chuyển hướng stdin, stdout và stderr từ / đến /dev/null, bỏ qua hangouts, chạy trong nền và tách ra.

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

Sau đó, bạn có thể làm sbg emacs. Bạn cũng có thể vượt qua bất kỳ đối số nào bạn muốn : sbg emacs --daemon FILE1 FILE2.


các giải pháp kịch bản làm việc tốt nhất cho tôi. cảm ơn!! mặc dù tôi đã sử dụng (gui_app &> /dev/null &)thay thế (câu trả lời của @ EMPraptor)
Jimi Oke


3

nếu bạn đang sử dụng bash, bạn có thể từ chối quy trình:

% firefox &
% disown 


1

Như các câu trả lời khác nói, bạn có thể sử dụng như sau:

$ emacs &

Nếu bạn quên &mặc dù, chỉ cần nhấn Ctrl-zsau đó sử dụng bg:

[1]+  Stopped                 emacs
$ bg
[1]+ emacs &
$

FYI: Ctrl-zdừng quá trình emacs và bggửi vào nền.


0

chỉ sử dụng &như trong $ x &lá quá trình gắn liền với thiết bị đầu cuối, tôi đã chọn một chương trình nhỏ có tên detach http://inglorion.net/software/detach/ mà tôi đã đặt bí danh vì dnó hơi giống nohupnhưng không để lại một tệp nhật ký i sử dụng nó để tách mupdf :d mupdf x.pdf


0

Đặt cái này cho bạn ~/.bashrc:

debug_trap_skip()
{
    local cmd_type=$(type -t "$1")

    # Empty cmd_type is for inexistent command or variable definition, exclude them
    # and shell builtins except echo, set and env:
    [[ -z "$cmd_type" || "$cmd_type" = builtin && "$1" != echo && "$1" != set && "$1" != env ]] &&
        return 0

    return 1
}

debug_trap_x11()
{
    if ldd `which $1`|grep -q libX11
    then
        setsid "$@"
        return 0
    fi
    return 1
}

debug_trap()
{
    [[ -n "$COMP_LINE" ]] && return  # do nothing if completing
    [[ "$BASH_COMMAND" = "$PROMPT_COMMAND" ]] && return
    debug_trap_skip $BASH_COMMAND && return 0
    debug_trap_x11 $BASH_COMMAND && return 1

    return 0
}

shopt -s extdebug
trap debug_trap DEBUG

Bây giờ bạn không cần phải nhớ chương trình nào là X11 và thực hiện các thao tác đặc biệt cho chúng vì chúng sẽ tự động tách ra. Lưu ý rằng setsidtốt hơn là nohupvì cái cuối cùng chặn tín hiệu HUP không phải là thứ bạn cần.

PS Bây giờ bạn đã sẵn winminesàng trong Linux.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.