Jalankan perintah tanpa membuat saya menunggu

145

Di CLI, kadang-kadang perintah yang saya ketik membutuhkan waktu untuk diselesaikan, dan kadang-kadang saya tahu kapan itu akan terjadi. Saya agak bingung tentang "latar belakang" dan semacamnya di Linux.

Apa cara yang paling umum (atau cara yang ramah pengguna) untuk mengatakan pada CLI bahwa saya tidak ingin menunggu, tolong beri saya kembali prompt saya segera. Dan jika itu bisa memberi saya progress bar atau hanya pemintal sibuk, itu akan bagus!

kaca
sumber
3
Lihat juga Bagaimana Anda mengirim aplikasi baris perintah langsung ke latar belakang? jika Anda sudah memulai perintah dan ingin mengirimkannya ke latar belakang.
Gilles

Jawaban:

153

Sebelum menjalankan perintah, Anda dapat menambahkan &ke baris perintah untuk dijalankan di latar belakang:

long-running-command &

Setelah memulai perintah, Anda dapat menekan CtrlZuntuk menangguhkannya, dan kemudian bgmeletakkannya di latar belakang:

long-running-command
[Ctrl+Z]
bg
Greg Hewgill
sumber
Saya menggunakan perintah "find ~ / a.java &" tetapi saya tidak pergi di latar belakang? Juga, saya mencoba cmd + z (untuk mac) .... tidak berfungsi
Abhimanyu Aryan
1
@AbhimanyuAryan, mungkin Anda ingin men-debug find ...perintah Anda terlebih dahulu, kemudian jalankan di latar belakang. Dalam hal ini Anda kehilangan -nameopsi.
Alexis Wilke
113

Ini adalah favorit semua karena selain mengirim proses ke latar belakang Anda tidak perlu khawatir tentang output teks mengotori terminal Anda:

nohup command &

Ini tidak hanya menjalankan proses di latar belakang, juga menghasilkan log (dipanggil nohup.outdi direktori saat ini, jika itu tidak mungkin, direktori home Anda) dan jika Anda menutup / logout shell saat ini proses tidak terbunuh dengan mencegah proses anak dari menerima induk memberi sinyal ketika terbunuh (mis. logout, dengan SIGHUP ke induk, atau menutup shell saat ini).

Ada yang disebut lain disowntetapi itu lebih merupakan perpanjangan dari jawaban lain daripada metode itu sendiri:

command & # our program is in background
disown # now it detached itself of the shell, you can do whatever you want

Perintah-perintah ini tidak memungkinkan Anda untuk dengan mudah memulihkan output proses kecuali jika Anda menggunakan cara peretasan untuk menyelesaikannya.

Braiam
sumber
4
Sysadmin sejak '95. Tidak pernah mendengar penolakan sampai hari ini, terima kasih! Itu tidak bekerja dengan setiap shell (memeriksa bash, zsh, tcsh. Tcsh tidak berfungsi).
yoonix
Menggunakan nohupshell kontrol pekerjaan itu konyol. Kerang modern tidak mengirim HUPke proses latar belakang. Mengarahkan ulang ke nama file unik adalah harga yang murah untuk dibayar.
anak ayam
@chicks use case di sini adalah untuk mencegah stderr dan stdout mencemari terminal dengan nilai tambah yang membuat file log secara otomatis.
Braiam
1
command > file.log 2>&1 & disownsedikit lebih lama dari nohup command &tapi saya kira itulah yang menyarankan @chicks.
joeytwiddle
31

Ini mungkin yang Anda inginkan

my_command > output.log 2>&1 &

ini akan memulai perintah Anda, mengarahkan ulang stdout dan stderr ke beberapa output.logyang dapat Anda tentukan. Jika Anda tidak peduli untuk menyimpan hasilnya sama sekali - Anda dapat menggunakan /dev/nullfile yang sebenarnya.

&akan menjalankan perintah di latar belakang sehingga Anda dapat melanjutkan memasukkan perintah saat sedang berjalan. 2>&1mengarahkan ulang stderr ke stdout sehingga semua output tertangkap.

juga, ketika Anda menjalankan perintah seperti ini, Anda harus mendapatkan konfirmasi dari kernel yang mirip dengan ini: [2] 1234 Ini berarti bahwa proses Anda sedang berjalan di latar belakang dan id-nya 1234, sehingga Anda dapat membunuhnya nanti jika Anda ingin dengankill -9 1234

travnik
sumber
2
terima kasih, 2>&1sangat penting karena perintah dapat gagal dan coba output kesalahan dalam beberapa kasus!
ericn
1
Yang ini berfungsi ketika jawaban di atas tidak berterima kasih.
Domagoj
9

Lihatlah ke layar atau tmux . Contoh dengan tmux:

$ tmux new -d 'longrunningcommand'

Sementara jawaban lain menggunakan '&' ke latar belakang akan berfungsi, Anda harus mengarahkan ulang stdout (dan stderr!). Tanpa melakukan itu, output akan langsung menuju shell Anda, bercampur dengan output lain yang mungkin Anda miliki.

Backgrounding juga akan gagal jika Anda menjalankan perintah panjang dan logout atau terputus. Sistem akan mematikan pekerjaan Anda.

Jika Anda tidak terbiasa dengan layar atau tmux, pada dasarnya mereka memungkinkan Anda untuk melepaskan sepenuhnya dari shell Anda. Alih-alih latar program Anda, Anda latar belakang seluruh shell. Anda kemudian dapat beralih kembali nanti, bahkan dari komputer lain. Keduanya memiliki banyak fitur yang Anda mungkin atau mungkin tidak menemukan manfaat di luar use case ini.

Layar adalah program yang lama dicoba dan benar; tmux jauh lebih muda tetapi telah belajar dari masa lalu layar.

Yoonix
sumber
Jawaban ini melewatkan jawaban aktual dan terdengar seperti RTFM.
Lloeki
5

(Untuk kelengkapan-- sudah dijawab :) Anda meletakkan perintah di latar belakang dengan menambahkan &setelah perintah:

long_command with arguments > redirection &

Saya menambahkan jawaban ini untuk menjawab bagian lain dari pertanyaan Anda:

Tidak ada padanan sebenarnya dari spinner untuk menampilkan perintah latar belakang yang sedang berjalan, tetapi Anda dapat melihat status perintah latar belakang dengan mengetik jobsatau jobs -l. Ini akan menunjukkan kepada Anda perintah latar belakang Anda, dan apakah itu sedang berjalan, berhenti melalui sinyal (misalnya, dengan ^Z), atau kadang-kadang berhenti karena mereka sedang menunggu input interaktif dari Anda.

alexis
sumber
long_command with arguments &> redirection &untuk mengarahkan kembali stderrjuga
Ice-Blaze
3

Anda dapat menjalankan program di latar belakang menggunakan &. Misalnya, jika Anda ingin menjalankan yum install XyZmisalnya, Anda dapat menjalankan:

yum install XyZ &

The stdoutatau output dari program ini dapat diarahkan menggunakan >menimpa sebuah file, atau >>untuk menambahkan ke sebuah file. Misalnya, jika Anda ingin masuk yumfile yum.log:

yum install XyZ > yum.log &

Atau, jika Anda ingin menambahkan output ke file yang ada log:

yum install XyZ >> log &

Kesalahan dicetak ke stderrdan bukan stdout, dan dapat diarahkan ke file dengan cara yang sama, tetapi menggunakan 2>:

yum install XyZ 2> errors
yum install XyZ 2>> errors

Jika Anda ingin mengarahkan ulang keduanya stderrdan stdout, Anda dapat menggunakan &>:

yum install XyZ &> output
yum install XyZ &>> output
Davidson Chua
sumber
2

Anda dapat menjalankan perintah di latar belakang hanya dengan meletakkan &tanda setelahnya.

Sebagai contoh:

areallylong_command &

akan menjalankannya di latar belakang.

Anda selanjutnya dapat mengarahkan stdout / stderr ke file yang sesuai sehingga tidak muncul di terminal Anda saat Anda melakukan sesuatu.

Lihat ini untuk info lebih lanjut: http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html

mkc
sumber
0

Coba gunakan perintah 'layar' sebelum Anda memulai tugas yang sudah berjalan lama kemudian ketika Anda melepaskannya Anda dapat memasang kembali kembali ke dengan 'layar -r -d' kapan pun Anda perlu. Saya menemukan bahwa ketika menggunakan terminal melalui ssh atau koneksi jaringan lain mereka kadang-kadang bisa rusak oleh koneksi yang buruk ke server. menjalankannya di dalam 'layar' memperbaiki masalah ini.

meaje
sumber