it-swarm-id.com

Jalankan perintah tanpa membuat saya menunggu

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 yang sibuk, itu akan bagus!

147
themirror

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

long-running-command &

Setelah memulai perintah, Anda dapat menekan CtrlZ untuk menangguhkannya, dan kemudian bg untuk meletakkannya di latar belakang:

long-running-command
[Ctrl+Z]
bg
158
Greg Hewgill

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 (disebut Nohup.out dalam 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 sinyal induk ketika terbunuh (mis. logout, oleh SIGHUP ke induk, atau menutup Shell saat ini).

Ada lainnya yang disebut disown tapi itu lebih merupakan perluasan dari jawaban lain dan bukan 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 keluaran proses kecuali Anda menggunakan cara peretasan untuk menyelesaikannya.

118
Braiam

Ini mungkin yang Anda inginkan

my_command > output.log 2>&1 &

ini akan memulai perintah Anda, mengarahkan ulang stdout dan stderr ke beberapa output.log yang dapat Anda tentukan. Jika Anda tidak ingin menyimpan hasilnya sama sekali - Anda dapat menggunakan /dev/null alih-alih file yang sebenarnya.

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

juga, ketika Anda menjalankan perintah seperti ini, Anda harus mendapatkan konfirmasi dari kernel yang mirip dengan ini: [2] 1234 Ini berarti bahwa proses Anda berjalan di latar belakang dan id-nya adalah 1234, jadi Anda bisa membunuhnya nanti jika Anda mau dengan kill -9 1234

35
travnik

Lihat 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 ke Shell Anda, bercampur dengan output lain apa pun 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.

10
yoonix

(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 nyata dari pemintal untuk menampilkan perintah latar belakang yang sedang diproses, tetapi Anda dapat melihat status perintah latar belakang dengan mengetik jobs atau jobs -l. Ini akan menunjukkan kepada Anda perintah latar belakang Anda, dan apakah perintah itu berjalan, dihentikan melalui sinyal (mis., Dengan ^Z), atau sesekali berhenti karena mereka sedang menunggu input interaktif dari Anda.

5
alexis

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

yum install XyZ &

stdout atau output dari program dapat dialihkan menggunakan > untuk menimpa file, atau >> untuk menambahkan file. Misalnya, jika Anda ingin login yum dalam file yum.log:

yum install XyZ > yum.log &

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

yum install XyZ >> log &

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

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

Jika Anda ingin mengarahkan kembali stderr dan stdout, Anda dapat menggunakan &>:

yum install XyZ &> output
yum install XyZ &>> output
4
Davidson Chua

Anda dapat menjalankan perintah di latar belakang hanya dengan meletakkan & tanda tangani setelah itu.

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

2
mkc

Coba gunakan perintah 'layar' sebelum Anda memulai tugas yang sudah berjalan lama kemudian ketika Anda melepaskannya, Anda dapat menempel kembali ke '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.

0
meaje