Làm cách nào để khởi chạy sạch một ứng dụng GUI qua Terminal?


78

Một số ứng dụng GUI khởi chạy sạch sẽ thông qua dòng lệnh Terminal, nhưng một số thì không, và chúng khiến Terminal chờ ứng dụng kết thúc. Thậm chí sau đó, một số không "giải phóng" dòng lệnh.

&Hậu tố bí ẩn và hậu tố dường như khiến thiết bị đầu cuối đưa quá trình vào nền (nhưng tôi không chắc điều gì xảy ra ở đó).

Có cách nào để khởi chạy một ứng dụng thông qua Terminal để không có hiệu ứng "treo trên", giống như khởi chạy một cái gì đó qua Alt+ F2?

Tôi muốn có sẵn dòng lệnh ngay lập tức, không có thứ gì vẫn còn trong nền và in trong thiết bị đầu cuối.


Theo yêu cầu của htorque, tôi đã xóa câu trả lời của anh ấy mà bạn chấp nhận. Xin vui lòng bạn có thể chọn một câu trả lời khác (trước tiên bạn sẽ phải bỏ chọn htorque - nên ẩn ở cuối trang màu đỏ)
Oli

1
Phương pháp để đối phó với một Chương trình đã chạy (như được phác thảo bởi con-f-use) là tốt cho tình huống đó, nhưng vì câu hỏi chính của tôi là về khởi chạy sạch không có lộn xộn thiết bị đầu cuối , tôi đã chấp nhận screen(được đề cập bởi Oli và RobinJ). Tôi ấn tượng bởi khả năng của nó; sau khi đọc về nó và dùng thử ... Nó chỉ cần gõ: screen -d -m gedit(hoặc screen geditsau đó Ctrl+a dđể tách ra) ... và tôi vẫn có quyền truy cập đầy đủ vào chế độ xem thiết bị đầu cuối của gedit (cho các tin nhắn cảnh báo, v.v.) bất cứ lúc nào screen -rngay cả khi tôi đã đóng cửa sổ thiết bị đầu cuối trong thời gian này ...
Peter.O

BTW, một số điều bạn gán cho thiết bị đầu cuối thực sự được thực hiện bởi shell, ví dụ như diễn giải &hậu tố lệnh. Điều này có thể hữu ích để làm rõ: sự khác biệt giữa Terminal, Console, Shell và Command Line là gì?
wjandrea

Câu trả lời:


17

Trong trường hợp của gedit, tôi chỉ luôn mở một bản sao. Miễn là bạn có một bản sao hiện có đang chạy, khởi chạy geditcác cuộc gọi từ thiết bị đầu cuối và sau đó đóng thiết bị đầu cuối sẽ không giết gedit.

Đối với những thứ khác, những gì người khác đã nói cũng sẽ làm việc. Tôi là một fan hâm mộ của nohup... Nhưng nếu bạn cần một thiết bị đầu cuối, bạn có thể tách ra nhưng sau đó gắn lại, bạn muốn xem xét screen.

  1. Chạy nó trong một thiết bị đầu cuối và sau đó chạy một cái gì đó tiếp tục đẩy đầu ra. Tôi sử dụng máy chủ phát triển Django nhưng irssihoặc thậm chí watch uptimesẽ là ví dụ điển hình.
  2. Giết thiết bị đầu cuối và bắt đầu một cái mới.
  3. Chạy screen -rvà BÙM, bạn trở lại.

screenlớn hơn thế nhiều và bạn có thể kết hợp nó byobuđể có trải nghiệm thiết bị đầu cuối tốt hơn. Đọc xung quanh.


Đây là cái nhìn sâu sắc thực sự đầu tiên tôi có về việc màn hình này có thể / có thể làm gì ... cảm ơn vì mẹo thiết bị đầu cuối ...
Peter.O

màn hình không còn nữa, nhưng tmux có thể thay thế màn hình. (tmux để bắt đầu phiên tmux mới, ctrl + b, sau đó nhấn d để deatach và tmux gắn vào reattach)
Gman Smith

84

Giả sử geditlà chương trình bạn muốn chạy tách ra (hay còn gọi là "disained", "disentangled", "decoupling"). Có nhiều cách khác nhau tùy thuộc vào những gì bạn muốn làm chính xác:

Chương trình đã chạy

Từ chối:

disown -hlà cách để đi nếu bạn muốn làm điều đó với một chương trình đã chạy (tức là nếu bạn quên nohupnó). Trước tiên bạn phải dừng nó bằng Ctrl+ Z. Sau đó, bạn có thể đặt trong nền bằng cách sử dụng bg [jobId](ví dụ bg 1). Bạn nhận được một danh sách các công việc đang chạy với jobId của họ bằng cách sử dụng jobs. Sau đó, bạn có thể tách nó từ thiết bị đầu cuối bằng cách sử dụng disown -h %[jobId]. Ví dụ phiên thiết bị đầu cuối:

$ gedit 
^Z
[1]+  Stopped                 gedit
$ jobs
[1]+  Stopped                 gedit
$ bg 1
[1]+ gedit &
$ disown -h %1
$ exit

Chương trình chưa bắt đầu

không

nohupkhông phải lúc nào cũng có mặt trên tất cả các máy. Nếu bạn biết bạn muốn tách riêng trước, bạn sẽ sử dụng:

nohup gedit &

Có thể bạn cũng sẽ muốn chuyển hướng đầu ra shell và chương trình của bạn là nguồn đầu vào giả, vì vậy : nohup ./myprogram > foo.out 2> bar.err < /dev/null &. Bạn sẽ muốn chuyển hướng đầu ra để không bị làm phiền bởi nó hoặc sử dụng nó sau này. Đầu vào null có thể giúp ngăn chặn những cú hích trong ssh như vậy.

Subshell:

Bạn có thể đạt được hiệu quả tương tự bằng cách

$ (geany >/dev/null 2>&1 &)

Các dấu ngoặc mở một lớp con mới để chạy gedit. >/dev/null 2>&1Chuyển hướng đầu ra của vỏ đến hư không (triệt tiêu đầu ra). Và &cuối cùng đặt quá trình trong nền.

Ghép kênh đầu cuối

Ngoài ra ghép kênh đầu cuối bằng màn hình hoặc byobu . Về cơ bản, bạn chạy chương trình trong một thiết bị đầu cuối của riêng mình. Tôi thực sự có thể giới thiệu byobu vì những lý do khác. Dưới đây là danh sách các phím tắt boybu có thể có ích cho các bước đầu tiên của bạn:

Hữu ích:

  • F2 Tạo một cửa sổ mới
  • F3 Di chuyển đến cửa sổ tiếp theo
  • F4 Di chuyển đến cửa sổ trước
  • F6 Tách khỏi phiên và đăng xuất
  • Shift-F6 Tách khỏi phiên, nhưng không đăng xuất
  • F7 Vào chế độ cuộn / tìm kiếm
  • Ctrl-F5 Kết nối lại bất kỳ ổ cắm hoặc đại lý SSH / GPG

Ít hữu ích:

  • Shift-F2 Chia màn hình theo chiều ngang
  • Ctrl-F2 Chia màn hình theo chiều dọc
  • Shift-F3 Chuyển trọng tâm sang phần tiếp theo
  • Shift-F4 Chuyển trọng tâm sang phần tách trước
  • Shift-F5 Thu gọn tất cả các phần tách
  • F5 Làm mới tất cả các thông báo trạng thái
  • F8 Đổi tên cửa sổ hiện tại
  • F9 Khởi chạy Menu Cấu hình Byobu
  • F12 Khóa thoát của màn hình GNU
  • Alt-Pageup Cuộn qua lịch sử của cửa sổ này
  • Alt-Pagedown Di chuyển về phía trước qua lịch sử của cửa sổ này
  • Ctrl-a-! Bật hoặc tắt tất cả các phím bấm của Byobu

Daemon 'tại' và những người khác

atlà một công cụ nhỏ hữu ích để chạy lệnh tại thời điểm đã lên lịch. Nó có thể được 'sử dụng sai' để tách lệnh ra khỏi trình bao:

echo './myprogram myoption1 myoption2' | at now

Ngoài ra, bạn có thể xem xét setsidstart-stop-daemon, nhưng các phương pháp khác nên đủ.


Mẹo: nếu chỉ có một công việc, ID công việc là tùy chọn, ví dụ thay vì bg %1bạn chỉ có thể nhập bg.
MasterMastic

25

Hậu tố bí ẩn "&" hậu tố, dường như khiến thiết bị đầu cuối đưa quá trình vào nền ... (nhưng tôi không chắc điều gì xảy ra ở đó).

Nó làm, và thường là những gì bạn muốn. Nếu bạn quên sử dụng &, bạn có thể tạm dừng chương trình bằng ctrl-z sau đó đặt chương trình vào nền bằng lệnh bg - và tiếp tục sử dụng trình bao đó.

Quá trình 'stdin, stdout và stderr vẫn được kết nối với thiết bị đầu cuối; bạn có thể chuyển hướng những tệp từ / đến / dev / null hoặc bất kỳ tệp nào khác (ví dụ: lưu nhật ký đầu ra ở đâu đó), như mong muốn:

some-program </dev/null &>/dev/null &
# &>file is bash for 1>file 2>&1

Bạn có thể thấy quá trình trong các công việc, đưa nó trở lại tiền cảnh (lệnh fg) và gửi tín hiệu (lệnh kill).

Một số chương trình đồ họa sẽ tách ra khỏi thiết bị đầu cuối; nếu đó là trường hợp, khi bạn chạy lệnh "bình thường", bạn sẽ thấy nó khởi động chương trình đồ họa "thoát".


Đây là một đoạn mã ngắn , bạn có thể đặt nó vào ~ / bin , mà tôi đặt tên là runbg:

#!/bin/bash
[ $# -eq 0 ] && {  # $# is number of args
  echo "$(basename $0): missing command" >&2
  exit 1
}
prog="$(which "$1")"  # see below
[ -z "$prog" ] && {
  echo "$(basename $0): unknown command: $1" >&2
  exit 1
}
shift  # remove $1, now $prog, from args
tty -s && exec </dev/null      # if stdin is a terminal, redirect from null
tty -s <&1 && exec >/dev/null  # if stdout is a terminal, redirect to null
tty -s <&2 && exec 2>&1        # stderr to stdout (which might not be null)
"$prog" "$@" &  # $@ is all args

Tôi tìm kiếm chương trình ($ prog) trước khi chuyển hướng để có thể báo cáo lỗi trong việc định vị chương trình. Chạy nó dưới dạng "runbg your-command args ..."; bạn vẫn có thể chuyển hướng stdout / err sang một tệp nếu bạn cần lưu đầu ra ở đâu đó.

Ngoại trừ các chuyển hướng và xử lý lỗi, điều này tương đương với câu trả lời của htorque .


Được rồi, cảm ơn ... Có vẻ như ctrl-z(đình chỉ) cho tôi quyền truy cập vào dòng lệnh một lần nữa, nhưng làm trống GUI cho đến khi tôi phát hành bgdường như bỏ tạm dừng nó. (có ý nghĩa) ... Có một lệnh khác mà tôi có thể tách GUI ... Aha! Tôi thấy bây giờ những gì bạn có nghĩa là bởi sighals (kill command)... (những điều thú vị những tín hiệu) .. tôi đã sử dụng một đoạn mã để làm cho ddđầu ra dần dần nó stats .. và nó được sử dụng kill+ a SIGNAL ... Có một tín hiệu cụ thể để tách một "công việc "?
Peter.O

Tôi chỉ nhận thấy bình luận của bạn về câu trả lời của Rick ... Tôi đã thử disown công việc -p gedit`` và dường như loại bỏ công việc .... (nhưng tôi đã nhận được tin nhắn hệ thống trong Terminal khi tôi đóng thủ công ... nhưng tôi nghĩ Tôi đã có một Terminal bị
hỏng

@fred: Công việc được quản lý bởi shell, vì vậy không có tín hiệu nào có thể kiểm soát điều đó. Bạn có thể thấy nó hoạt động tốt nhất để bắt đầu một số shell - một số thiết bị đầu cuối GUI cho phép các tab và bạn có thể sử dụng màn hình hoặc tmux.

2
@fred: tốt hơn đừng chạy jobs -p commandnếu bạn có nhiều phiên bản của một lệnh chạy trong nền cùng một lúc. bạn có thể sử dụng jobsđể tìm id công việc phù hợp và sau đó thực hiện jobs -p <job-id>để có được PID của công việc. Cá nhân tôi thấy phiên bản với subshell dễ dàng hơn rất nhiều. ;-)
htorque

2
@htorque, fred: Bạn có thể chạy disown mà không có tham số để bash từ chối công việc cuối cùng:gedit & disown

22

Để bắt đầu một ứng dụng và tách nó khỏi thiết bị đầu cuối đã khởi chạy, hãy sử dụng &!.

firefox &!

6
Tốt để biết, nhưng đó dường như chỉ là zsh. Trong bash, bạn phải chạy thủ công disown <pid-of-command>sau khi bắt đầu lệnh trong nền.
htorque

Thú vị ... Tôi sẽ xem xét zsh, nhưng với tư cách là một người mới sử dụng Linux, tôi sẽ gắn bó với bash ngay bây giờ ... Cảm ơn
Peter.O

dấu chấm than làm gì?
hấp dẫn về

1
Các ! sẽ phá vỡ quy trình ứng dụng khỏi quy trình thiết bị đầu cuối để bạn có thể đóng thiết bị đầu cuối mà không cần ứng dụng đã được khởi chạy khi đóng. Nó có vẻ là một điều zsh, nhưng tiện dụng.
Rick

Nhưng điều này làm việc trong bash quá @htorque .... Vì vậy, tôi đoán nó không phải là một vấn đề.
Jasser

20

Sử dụng nohup

nohup là một chương trình chạy một lệnh đã cho với các tín hiệu gác máy bị bỏ qua, để lệnh có thể tiếp tục chạy trong nền sau khi quá trình cha của nó kết thúc. Xem trang

Ví dụ:

nohup gedit something

2
nohupgì Xin hãy giải thích.
Oxwivi

3
nohup là một chương trình chạy một lệnh đã cho với các tín hiệu gác máy bị bỏ qua, để lệnh có thể tiếp tục chạy trong nền sau khi quá trình cha của nó kết thúc. Xem trang này
Florian Diesch

Thật ra tôi nghĩ câu trả lời của tôi không đúng ở đây. Suy nghĩ thêm, nohupnên được sử dụng trong kịch bản này.
boehj

2
Khi một vỏ tương tác nhận được tín hiệu SIGHUP, có thể gửi (hoặc không, tùy thuộc vào cài đặt) tín hiệu SIGHUP cho tất cả các con của nó. Điều này có thể xảy ra (hoặc không, một lần nữa) khi đóng một thiết bị đầu cuối. Một đứa trẻ không sẵn sàng để xử lý một tín hiệu như vậy sẽ thực hiện hành động mặc định, tức là thoát. Các nohupứng dụng (và disownđược xây dựng trong bash) không cho phép các tín hiệu để đạt được ứng dụng.
enzotib

2
Một điều cần cẩn thận là nohuptạo một tệp trong thư mục hiện tại được gọi nohup.out. Xem trang người đàn ông để biết thêm chi tiết. Tôi thích disownvì lý do này, và thực tế là disownhoạt động sau khi bạn khởi chạy gedit.
Flimm

4

Mở terminal, gõ màn hình , gõ lệnh bạn muốn chạy, đóng terminal. Chương trình sẽ tiếp tục chạy trong phiên GNU Screen .


Chính xác thì GNU Screen là gì?
Oxwivi

Nếu tôi có ý tưởng chính xác, đó là một loại trình quản lý cửa sổ cho dòng lệnh. Nó cho phép bạn chạy nhiều chương trình cùng một lúc trong phiên giao diện dòng lệnh.
RobinJ

Byobu?
Oxwivi

Một cái gì đó như thế, chỉ có Byobu là dễ sử dụng hơn. Nếu tôi nhầm lẫn, Byobu chỉ là một giao diện dễ dàng hơn cho GNU Screen.
RobinJ


1

mở xdg

Hãy xem tiện ích đa năng này: https://linux.die.net/man/1/xdg-open

Điều này sẽ mở một vị trí tương đối trong trình quản lý tập tin của bạn.

 $ xdg-open .

Điều này sẽ mở một tập tin pdf trong một trình đọc pdf.

 $ xdg-open foo.pdf

Bạn thậm chí có thể cung cấp URL web

$ xdg-open www.google.com

0

Như rất nhiều người nghĩ, nohup là điều cần xem xét. Nhưng các ảnh tĩnh vẫn mở trên thiết bị đầu cuối và hiển thị hoạt động của chương trình trên thiết bị đầu cuối gây khó chịu. Bạn chỉ có thể đóng thiết bị đầu cuối sau đó để tránh như vậy. Tôi phát hiện ra một cách giải quyết rất đơn giản mà tôi sử dụng.

nohup gedit & exit

Và đó là nó. Nó mở gedit và đóng thiết bị đầu cuối khi gedit khởi động. Vì gedit không được liên kết với thiết bị đầu cuối bây giờ, nó vẫn hoạt động.


0

Điều này hoạt động ngay cả trong một tập lệnh (Giống như bí danh, đoạn giới thiệu '&' thường không được phép trong tập lệnh vì chúng không tương tác):

bash -i >/dev/null 2>&1 <<<'nohup gedit &'

0

Điều này làm việc cho tôi:

$ (some-program &) &>/dev/null

# Examples:
$ (gedit &) &>/dev/null
$ (google-chrome &) &>/dev/null
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.