Bagaimana cara meluncurkan aplikasi GUI secara bersih melalui Terminal?

78

Beberapa aplikasi GUI diluncurkan dengan bersih melalui baris perintah Terminal, tetapi beberapa tidak, dan menyebabkan Terminal menunggu aplikasi berakhir. Bahkan kemudian, beberapa tidak "melepaskan" baris perintah.

&Akhiran ampersand yang misterius tampaknya menyebabkan terminal untuk meletakkan proses ke latar belakang (tapi saya tidak yakin apa yang terjadi di sana).

Apakah ada cara untuk meluncurkan aplikasi melalui Terminal sehingga tidak ada efek "tunggu", seperti meluncurkan sesuatu melalui Alt+ F2?

Saya ingin agar baris perintah segera tersedia lagi, tanpa sesuatu yang masih di latar belakang dan mencetak di terminal.

Peter.O
sumber
Atas permintaan htorque, saya menghapus jawabannya yang Anda terima. Bisakah Anda memilih jawaban lain (Anda harus membatalkan pilihan htorque pertama - harus bersembunyi di bagian bawah halaman dengan warna merah)
Oli
1
Metode untuk menangani Program yang sudah berjalan (seperti yang dijelaskan oleh penggunaan bersama) baik untuk situasi itu, tetapi karena pertanyaan utama saya adalah tentang peluncuran bersih tanpa kekacauan terminal , saya telah menerima screen(disebutkan oleh Oli dan RobinJ). Saya terkesan dengan kemampuannya; setelah membaca tentang hal itu dan mencobanya ... Hanya perlu mengetik: screen -d -m gedit(atau screen geditkemudian Ctrl+a dmelepaskan) ... dan saya masih memiliki akses penuh ke tampilan terminal gedit (untuk pesan peringatan dll) setiap saat melalui screen -rbahkan jika saya telah menutup jendela terminal asli sementara itu ...
Peter.O
BTW, beberapa hal yang Anda kaitkan ke terminal sebenarnya dilakukan oleh shell, misalnya menafsirkan &sufiks perintah. Ini mungkin membantu untuk klarifikasi: Apa perbedaan antara Terminal, Konsol, Shell, dan Baris Perintah?
wjandrea

Jawaban:

17

Dalam kasus gedit, saya hanya menyimpan salinan terbuka sepanjang waktu. Selama Anda memiliki salinan yang sudah berjalan, meluncurkan geditpanggilan dari terminal dan kemudian menutup terminal tidak akan membunuh gedit.

Untuk hal-hal lain, apa yang dikatakan orang lain juga akan berhasil. Saya penggemar nohup... Tetapi jika Anda membutuhkan terminal, Anda dapat melepaskan tetapi kemudian melampirkan kembali, Anda ingin melihatnya screen.

  1. Jalankan di terminal dan jalankan sesuatu yang terus mendorong output. Saya menggunakan server pengembangan Django tetapi irssiatau bahkan watch uptimeakan menjadi contoh yang baik.
  2. Bunuh terminal dan mulai yang baru.
  3. Jalankan screen -rdan BOOM, Anda kembali.

screenjauh lebih besar dari itu dan Anda dapat menggabungkannya dengan byobuuntuk pengalaman terminal yang lebih baik. Baca sekitar.

Oli
sumber
Ini adalah wawasan nyata pertama yang saya miliki tentang apa yang bisa / tidak bisa dilakukan layar ... terima kasih atas tip terminalnya ...
Peter.O
layar tidak lagi tersedia, tetapi tmux dapat mengganti layar. (tmux untuk memulai sesi tmux baru, ctrl + b, lalu tekan d untuk deatach, dan tmux melampirkan untuk melampirkan kembali)
Gman Smith
84

Misalkan geditadalah program yang Anda ingin jalankan terpisah (alias. "Tidak diakui", "terurai", "dipisahkan"). Ada berbagai cara tergantung pada apa yang ingin Anda lakukan dengan tepat:

Program sudah berjalan

Memungkiri:

disown -hadalah cara untuk pergi jika Anda ingin melakukan itu dengan program yang sudah berjalan (yaitu jika Anda lupa nohup). Pertama-tama Anda harus menghentikannya menggunakan Ctrl+ Z. Kemudian Anda dapat memasukkan latar belakang menggunakan bg [jobId](misalnya bg 1). Anda mendapatkan daftar menjalankan pekerjaan dengan menggunakan jobId mereka jobs. Setelah itu Anda dapat memisahkannya dari terminal menggunakan disown -h %[jobId]. Contoh sesi terminal:

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

Program belum dimulai

tidak

nohuptidak selalu ada di semua mesin. Jika Anda tahu Anda ingin memisahkan diri sebelumnya, Anda akan menggunakan:

nohup gedit &

Mungkin Anda akan ingin mengarahkan output shell juga dan program anda sumber masukan semu, sehingga: nohup ./myprogram > foo.out 2> bar.err < /dev/null &. Anda ingin mengarahkan output agar tidak terganggu atau menggunakannya nanti. Input-nol dapat membantu untuk mencegah hickup di ssh an tersebut.

Subshell:

Anda dapat mencapai efek serupa dengan

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

Kurung membuka subkulit baru untuk menjalankan gedit. >/dev/null 2>&1Pengalihan shell output ke mana-mana (menekan output). Dan &pada akhirnya menempatkan proses di latar belakang.

Terminal multiplexing

Juga terminal multiplexing menggunakan layar atau byobu . Anda pada dasarnya menjalankan program di terminal sendiri. Saya benar-benar dapat merekomendasikan byobu untuk alasan lain juga. Di bawah ini adalah daftar cara pintas boybu yang mungkin berguna untuk langkah pertama Anda:

Berguna:

  • F2 Buat jendela baru
  • F3 Pindah ke jendela berikutnya
  • F4 Pindah ke jendela sebelumnya
  • F6 Lepaskan dari sesi dan keluar
  • Shift-F6 Lepaskan dari sesi, tetapi jangan keluar
  • F7 Masuk ke mode scrollback / search
  • Ctrl-F5 Hubungkan kembali soket atau agen SSH / GPG

Kurang bermanfaat:

  • Shift-F2 Membagi layar secara horizontal
  • Ctrl-F2 Membagi layar secara vertikal
  • Shift-F3 Pindahkan fokus ke pemisahan berikutnya
  • Shift-F4 Pindahkan fokus ke pemisahan sebelumnya
  • Shift-F5 Perkecil semua pemisahan
  • F5 Segarkan semua pemberitahuan status
  • F8 Ganti nama jendela saat ini
  • F9 Luncurkan Menu Konfigurasi Byobu
  • F12 Kunci Escape Layar GNU
  • Alt-Pageup Gulir kembali melalui riwayat jendela ini
  • Alt-Pagedown Gulir maju melalui riwayat jendela ini
  • Ctrl-a-! Nyalakan atau matikan semua kunci kontak Byobu

The 'at' daemon dan lainnya

atadalah alat kecil yang bagus dan berguna untuk menjalankan perintah pada waktu yang dijadwalkan. Ini bisa 'disalahgunakan' untuk melepaskan perintah dari shell:

echo './myprogram myoption1 myoption2' | at now

Anda juga dapat melihat setsiddan start-stop-daemon, tetapi metode lain sudah cukup.

membingungkan
sumber
Kiat: jika hanya ada satu pekerjaan, ID pekerjaan itu opsional, mis. Alih-alih bg %1Anda bisa mengetik saja bg.
MasterMastic
25

Akhiran ampersand "&" yang misterius, tampaknya menyebabkan terminal untuk meletakkan proses ke latar belakang ... (tapi saya tidak yakin apa yang terjadi di sana).

Ya, dan sering apa yang Anda inginkan. Jika Anda lupa menggunakan &, Anda dapat menangguhkan program dengan ctrl-z kemudian meletakkannya di latar belakang dengan perintah bg - dan terus menggunakan shell itu.

Proses 'stdin, stdout, dan stderr masih terhubung ke terminal; Anda dapat mengarahkan mereka dari / ke / dev / null atau file lain (mis. menyimpan log keluaran di suatu tempat), seperti yang diinginkan:

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

Anda dapat melihat proses dalam pekerjaan, membawanya kembali ke latar depan (perintah fg), dan mengirimkannya sinyal (perintah kill).

Beberapa program grafis akan terlepas dari terminal; jika itu masalahnya, ketika Anda menjalankan perintah "biasanya" Anda akan melihat itu memulai program grafis dan "keluar".


Berikut ini skrip pendek , Anda bisa meletakkannya di ~ / bin , yang saya beri nama 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

Saya mencari program ($ prog) sebelum mengarahkan sehingga kesalahan dalam menemukan itu dapat dilaporkan. Jalankan sebagai "runbg your-command args ..."; Anda masih dapat mengarahkan ulang stdout / err ke file jika Anda perlu menyimpan output di suatu tempat.

Kecuali untuk pengalihan dan penanganan kesalahan, ini setara dengan jawaban htorque .

Komunitas
sumber
Oke, terima kasih ... Tampaknya ctrl-z(menangguhkan) memberi saya akses ke baris perintah lagi, tetapi mengosongkan GUI sampai saya mengeluarkan bgyang tampaknya untuk menangguhkannya. (masuk akal) ... Apakah ada perintah lain yang dapat saya gunakan untuk melepaskan GUI ... Aha! Saya mengerti sekarang apa yang Anda maksudkan dengan sighals (kill command)... (hal-hal menarik sinyal-sinyal ini) .. Saya menggunakan cuplikan kode untuk membuat ddstatistiknya menjadi lebih banyak secara statistik .. dan menggunakan kill+ sebuah SIGNAL ... Apakah ada SIGNAL khusus untuk melepaskan "pekerjaan" "?
Peter.O
Saya baru saja memperhatikan komentar Anda pada jawaban Rick ... Saya mencoba disown pekerjaan -p gedit`` dan sepertinya menghapus pekerjaan .... (tapi saya mendapat pesan sistem di Terminal ketika saya secara manual menutup gedit ... tapi saya pikir Saya punya Terminal yang kacau saat ini ... terlalu banyak bereksperimen :(
Peter.O
@ Fred: Pekerjaan dikelola oleh shell, jadi tidak ada sinyal yang bisa mengendalikan itu. Anda mungkin menemukan bahwa itu yang terbaik untuk memulai beberapa shell - beberapa terminal GUI memungkinkan tab dan Anda dapat menggunakan layar atau tmux.
2
@ Fred: lebih baik tidak berjalan jobs -p commandjika Anda memiliki beberapa contoh dari satu perintah yang berjalan di latar belakang pada suatu waktu. Anda dapat menggunakan jobsuntuk menemukan id pekerjaan yang tepat dan kemudian lakukan jobs -p <job-id>untuk mendapatkan PID pekerjaan. Secara pribadi saya menemukan versi dengan subkulit jauh lebih mudah. ;-)
htorque
2
@Htorque, fred: Anda dapat menjalankan disown tanpa parameter untuk memiliki bash menolak pekerjaan terakhir:gedit & disown
22

Untuk memulai aplikasi dan melepaskannya dari terminal yang diluncurkan gunakan & !.

firefox &!
Rick
sumber
6
Baik untuk diketahui, tetapi itu tampaknya hanya zsh. Dalam bash Anda harus menjalankannya secara manual disown <pid-of-command>setelah memulai perintah di latar belakang.
htorque
Menarik ... Saya akan melihat ke zsh, tetapi sebagai pemula Linux, saya akan tetap dengan bash untuk saat ini ... Terima kasih
Peter.O
apa yang dilakukan tanda seru?
gila tentang rapi
1
Itu! akan memecah proses aplikasi dari proses terminal sehingga Anda dapat menutup terminal tanpa aplikasi yang diluncurkan dari penutupan. Tampaknya menjadi hal yang zsh, tetapi berguna.
Rick
Tapi ini bekerja di bash juga @htorque .... Jadi saya kira itu tidak masalah.
Jasser
20

Menggunakan nohup

nohup adalah program yang menjalankan perintah yang diberikan dengan sinyal hangup diabaikan, sehingga perintah dapat terus berjalan di latar belakang setelah proses induknya berakhir. Lihat halaman manual

Sebagai contoh:

nohup gedit something
Florian Diesch
sumber
2
Apa nohup? Tolong jelaskan.
Oxwivi
3
nohup adalah program yang menjalankan perintah yang diberikan dengan sinyal hangup diabaikan, sehingga perintah dapat terus berjalan di latar belakang setelah proses induknya berakhir. Lihat halaman manual
Florian Diesch
Sebenarnya saya pikir jawaban saya salah di sini. Dipikirkan lebih lanjut, nohupharus digunakan dalam skenario ini.
boehj
2
Ketika shell interaktif menerima sinyal SIGHUP, dapat mengirim (atau tidak, tergantung pada pengaturan) sinyal SIGHUP ke semua anaknya. Ini bisa terjadi (atau tidak, lagi) ketika terminal ditutup. Seorang anak yang tidak siap untuk menangani sinyal seperti itu akan melakukan tindakan default, yaitu keluar. The nohupaplikasi (dan disownbuiltin bash) tidak memungkinkan sinyal untuk mencapai aplikasi.
enzotib
2
Satu hal yang harus diperhatikan adalah nohupmembuat file di direktori saat ini disebut nohup.out. Lihat halaman manual untuk lebih jelasnya. Saya lebih suka disownkarena alasan ini, dan untuk fakta yang disownbekerja setelah Anda meluncurkan gedit.
Flimm
4

Buka terminal, ketik layar , ketik perintah yang ingin Anda jalankan, tutup terminal. Program harus terus berjalan di sesi Layar GNU .

RobinJ
sumber
Apa sebenarnya Layar GNU?
Oxwivi
Jika saya mendapatkan ide dengan benar, itu adalah semacam window manager untuk baris perintah. Ini memungkinkan Anda untuk menjalankan lebih dari satu program sekaligus dalam sesi antarmuka baris perintah.
RobinJ
Byobu?
Oxwivi
Sesuatu seperti itu, hanya Byobu yang lebih mudah digunakan. Jika saya salah kaprah, Byobu hanyalah antarmuka yang lebih mudah untuk Layar GNU.
RobinJ
1

Ini bekerja untuk saya:

$ (nohup gedit 2>/dev/null &)
wesleycoder
sumber
1

xdg-buka

Lihat utilitas serba guna ini: https://linux.die.net/man/1/xdg-open

Ini akan membuka lokasi relatif di manajer file Anda.

 $ xdg-open .

Ini akan membuka file pdf dalam pembaca pdf.

 $ xdg-open foo.pdf

Anda bahkan dapat memberikan URL web

$ xdg-open www.google.com
Jonathan Komar
sumber
0

Seperti yang diketahui banyak orang, nohup adalah hal yang perlu dipertimbangkan. Tapi nohup tetap terbuka di terminal dan menampilkan aktivitas program di terminal yang menjengkelkan. Anda bisa menutup terminal setelah itu untuk menghindari hal itu. Saya menemukan solusi yang sangat sederhana yang saya gunakan.

nohup gedit & exit

Dan itu saja. Ini membuka gedit dan menutup terminal ketika gedit dimulai. Karena gedit tidak terkait dengan terminal sekarang, ia tetap aktif.

Lokesh Devnani
sumber
0

Ini berfungsi bahkan di dalam skrip (Seperti alias, cuplikan '&' biasanya tidak diizinkan di skrip karena tidak interaktif):

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

Ini bekerja untuk saya:

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

# Examples:
$ (gedit &) &>/dev/null
$ (google-chrome &) &>/dev/null
Eyal Levin
sumber