Bagaimana cara memulai program linux GUI dari baris perintah, tetapi terpisah dari baris perintah?

89

Saya sudah mencari ini sebelumnya, tetapi belum pernah menemukan jawaban.

Di Windows, jika saya memiliki jendela konsol terbuka, ketik winmine, dan tekan enter, Minesweeper akan muncul, benar-benar terpisah dari program cmd. Contoh Minesweeper tidak terikat dengan command prompt dengan cara apa pun yang saya ketahui, dengan pengecualian dari orangtua Minesweeper yang diatur ke instance dari prompt perintah. Namun berbeda dengan Linux.

Di Linux, jika saya memiliki jendela konsol terbuka, ketik emacsdan tekan enter, Emacs akan terbuka, tetapi tampaknya terikat ke baris perintah. Secara khusus, tampaknya saya tidak dapat menggunakan baris perintah lagi sampai instance Emacs ditutup. Apakah ada cara untuk mereplikasi perilaku Windows di Linux?

Terima kasih!

Jason
sumber
tolong beri jawaban untuk geekosaurus.
Joshua Robison
di windows7 itu minesweeper.exe di sini C: \ Program Files \ Microsoft Games \ Minesweeper sehingga minesweeper.exe umumnya tidak akan berfungsi .. karena direktori itu tidak ada di jalur .. Dan bagaimanapun, Anda harus menyatakan versi windows
barlop

Jawaban:

10

In bash, detachadalah built-in, digunakan sebagai berikut:

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

Di zsh, Anda dapat latar belakang dan lepas dalam satu operasi:

emacs &|
geekosaurus
sumber
108

Tambahkan &ke commandline:

emacs &

Ini akan menempatkan emacs di latar belakang dan memungkinkan Anda untuk terus menggunakan terminal Anda.

Perhatikan bahwa ini masih akan meninggalkan emacs sebagai sub-proses terminal Anda, dan ketika Anda keluar dari terminal, emacs juga akan keluar. Untuk menghindari ini, ketik:

(emacs &)

Tanda kurung memberitahu terminal untuk melepaskan proses emacs dari terminal.

Namun, pesan stdout dan stderr dari program akan muncul di terminal. Untuk mencegahnya, gunakan:

(emacs &> /dev/null &)
Nathan Fellman
sumber
9
Saya terutama menyukai tip (emacs &).
1
jika Anda sudah memulai tugas (emancs), maka gunakan CTRL-Z untuk mematikan dan kemudian gunakan perintah "bg" untuk mengirim ke latar belakang.
Jayan
@StackTrace: jika Anda melakukannya, dan Anda menutup terminal Anda, itu juga akan membunuh emacs.
Nathan Fellman
1
Oke .. Saya dulu menggunakan "nohup" lepaskan ini. Ini tidak dapat dilakukan setelah proses dimulai ...
Jayan
Ketika menekan Ctrl+ Cdi jendela terminal perintah ini dikeluarkan, prosesnya mati: <
Richard de Wit
21

Gunakan nohup. Seperti ini:nohup amarok &

Semoga ini membantu.

NawaMan
sumber
19

Saya memposting jawaban untuk topik lama yang serupa dengan jawaban dari berbagai sumber. Berikut ini adalah salinan jawaban yang disesuaikan untuk utas ini.


Karya berikut:

$ (gui_app &> /dev/null &)

Ini adalah jawaban Nathan Fellman plus pengalihan.

"&> / dev / null" mengarahkan ulang stdout dan stderr ke perangkat null. Ampersand terakhir membuat proses berjalan di latar belakang. Tanda kurung di sekitar perintah akan menyebabkan "gui_app" Anda berjalan dalam subkulit.

Melakukan ini akan melepaskan proses "gui_app" dari konsol tempat Anda menjalankan perintah ini. Jadi, bahkan jika Anda menutup emulator terminal induk jendela sedang berjalan, "gui_app" tidak akan menutup. Saya menjalankan ini kemudian melihat pohon proses dengan "pstree" perintah dan menemukan aplikasi mulai dengan cara ini akan menjadi proses anak untuk "init".

Sebagai contoh,

$ gui_app &> /dev/null &

akan menjalankan aplikasi di latar belakang, tetapi itu akan menjadi proses turunan dari proses konsol dan akan berakhir ketika Anda menutup terminal. (Meskipun keluar dari terminal melalui bash dengan menggunakan perintah keluar atau Ctrl-D akan membiarkan bash membersihkan dengan menyerahkan proses latar belakang untuk init.)

"nohup" berfungsi seperti yang disarankan NawaMan, tetapi itu mengalihkan keluaran & kesalahan ke file secara default. Seperti yang JeffG jawab, perintah "disown" (jika tersedia di shell) dapat melepaskan proses dari terminal setelah Anda memulai proses latar belakang:

$ gui_app &
$ disown

(BTW semua ini berlaku untuk bash. Saya yakin shell lain memiliki metode / sintaks lain untuk melakukan ini.)

Beberapa referensi: Proses Pembungkaman (UNIX Power Tools)

Jika itu panggilan sederhana ke aplikasi GUI - tanpa opsi rumit dan semacamnya - sepertinya menggunakan peluncur seperti "gmrun" atau dmenu (peringatan: audio keras) juga merupakan opsi yang baik. Ikat ke kombinasi tombol. Saya belum menggunakan peluncur tetapi sudah mencoba keduanya.

CATATAN: CarlF dalam komentar dari utas lainnya melaporkan aplikasi GUI yang dimulai melalui metode "gui_app &" tidak ditutup ketika ia keluar dari terminal induk. Saya pikir kami menutup terminal dengan cara yang berbeda. Saya sedang menutup jendela terminal emulator sedang berjalan masuk. Saya pikir dia mungkin telah keluar dari terminal emulator melalui shell (perintah keluar atau Ctrl-D). Saya menguji ini dan melihat bahwa keluar melalui bash tidak menghentikan GUI dimulai sebagai proses latar belakang terminal seperti kata CarlF. Sepertinya tidak perlu proses latar belakang untuk masuk ketika diberi kesempatan untuk membersihkan. Bahkan, ini harus menjadi mekanisme di mana proses latar belakang dimulai dalam subkulit diserahkan ke init.

EMPraptor
sumber
11

util-linux menyertakan alat yang disebut setsid yang pada dasarnya melakukan apa yang dilepaskan:

$ setsid someprogram

Ini akan berjalan someprogramdi sesi baru.

tonybaldwin
sumber
9

Coba ketikkan xemacs &untuk membuka XEmacs di latar belakang.

Harap jangan merujuk ini sebagai "meniru perilaku Windows". Aduh.

Anda juga bisa:

  • Buka terminal baru
  • Gunakan Alt + F2 atau window manager Anda untuk meluncurkan program, alih-alih menggunakan terminal
  • Gunakan Layar GNU
Borealid
sumber
7

Saya memasukkan kode berikut dalam file skrip yang dapat dieksekusi bernama "sbg" untuk "background diam". Ia melakukan semua hal yang diperlukan untuk memutus sepenuhnya program yang dimulai dari shell: pengalihan stdin, stdout dan stderr dari / ke /dev/null, mengabaikan hangup, berjalan di latar belakang, dan melepaskan.

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

Maka Anda bisa melakukannya sbg emacs. Anda juga dapat melewatkan argumen Anda ingin: sbg emacs --daemon FILE1 FILE2.

Ryan Thompson
sumber
solusi scripting bekerja paling baik untuk saya. Terima kasih!! meskipun saya menggunakan (gui_app &> /dev/null &)sebagai gantinya (@ jawaban EMPraptor)
Jimi Oke
3
command &

Letakkan tanda amper dan setelah perintah.

Jesse Dhillon
sumber
3

jika Anda menggunakan bash, Anda dapat menolak proses:

% firefox &
% disown 
JeffG
sumber
2

Anda dapat menggunakan satu baris ini:

$ emacs & disown
Idham Perdameian
sumber
1

Seperti jawaban lain katakan, Anda dapat menggunakan yang berikut:

$ emacs &

Jika Anda lupa &, cukup tekan Ctrl-zlalu gunakan bg:

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

FYI: Ctrl-zmenghentikan proses emacs dan bgmengirim ke latar belakang.

MatthewD
sumber
0

hanya menggunakan &seperti dalam $ x &meninggalkan proses yang melekat pada terminal saya mengambil sebuah program kecil bernama detach http://inglorion.net/software/detach/ yang saya aliased karena dagak mirip nohuptetapi tidak meninggalkan file log i gunakan untuk melepaskan mupdf :d mupdf x.pdf

Dan D.
sumber
0

Taruh ini untuk Anda ~/.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

Sekarang Anda tidak harus mengingat program mana yang X11 dan melakukan manipulasi khusus untuk mereka karena mereka akan terlepas secara otomatis. Catatan yang setsidlebih baik daripada nohupkarena yang terakhir memblokir sinyal HUP yang bukan yang Anda butuhkan.

PS Sekarang Anda sudah winminedi Linux.

midenok
sumber