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!



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 &|

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 &)

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.


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.


11

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

$ setsid someprogram

Ini akan berjalan someprogramdi sesi baru.


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

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.


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


3

jika Anda menggunakan bash, Anda dapat menolak proses:

% firefox &
% disown 


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.


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


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.