Bagaimana cara menjalankan perintah di latar belakang dan tidak mendapatkan keluaran?

111

Saya menulis dua skrip shell a.shdan b.sh. Dalam a.shdan b.shsaya memiliki loop for tak terbatas dan mereka mencetak beberapa output ke terminal. Saya ingin menulis skrip lain yang memanggil keduanya a.shdan b.shtetapi saya ingin pengguna segera mendapatkan kembali kendali atas terminal, alih-alih menjalankan skrip tanpa batas dan saya ingin menyembunyikan keluaran di terminal.

Behnam Safari
sumber

Jawaban:

220

Gunakan nohupjika pekerjaan latar belakang Anda membutuhkan waktu lama untuk diselesaikan atau Anda hanya menggunakan SecureCRT atau sesuatu seperti itu untuk masuk ke server.

Arahkan ulang stdout dan stderr ke /dev/nulluntuk mengabaikan keluaran.

nohup /path/to/your/script.sh > /dev/null 2>&1 &
George
sumber
Sekadar menambahkan, terkadang ada argumen untuk skrip maka perintah di atas akan mengembalikan redirect keluaran ambigu .
sabertooth1990
Cara yang lebih baik yang saya temukan adalah dengan menggunakan nohup /path/to/your/script.sh parameter1 > & 1 &Jika ada yang tahu cara yang lebih baik.
sabertooth1990
18
Anda tidak perlu /dev/null 2>&1jika Anda menggunakan nohupkarena sudah menambahkan semua aliran STDOUT dan STDERR ke file nohup.out secara otomatis. Gunakan saja:nohup /path/to/your/command &
Leonardo
1
@ sabertooth1990 Baris perintah Anda rusak:-bash: syntax error near unexpected token '&'
notes-jj
1
Lalu bagaimana Anda akan menghentikan proses yang dibuat?
Alexis_A
33

Alihkan output ke file seperti ini:

./a.sh > somefile 2>&1 &

Ini akan mengarahkan stdout dan stderr ke file yang sama. Jika Anda ingin mengalihkan stdout dan stderr ke dua file berbeda, gunakan ini:

./a.sh > stdoutfile 2> stderrfile &

Anda dapat menggunakan /dev/nullsebagai salah satu atau kedua file jika Anda tidak peduli dengan stdout dan / atau stderr.

Lihat halaman manual bash untuk detail tentang pengalihan.

Adam Zalcman
sumber
23

Maaf, ini agak terlambat tetapi menemukan solusi ideal untuk perintah somple di mana Anda tidak menginginkan output standar atau kesalahan apa pun (kredit saat jatuh tempo: http://felixmilea.com/2014/12/running-bash-commands-background -tepat / )

Ini mengalihkan keluaran ke nol dan menjaga layar tetap bersih:

command &>/dev/null &
DanteAlighieri
sumber
2
Catatan: perintah akan dihentikan saat terminal ditutup.
Pisang
1
Untuk siapa pun yang melihat ini di masa depan yang menginginkan solusi untuk menjaga perintah tetap berjalan setelah sesi berakhir, saya sarankan screen atau tmux. Mereka penting menjalankan 'sesi dalam sesi' yang dijalankan setelah Anda menutup sesi awal. Anda kemudian dapat menyambung kembali ke sesi yang sedang berlangsung jika Anda masuk kembali. Sangat bagus untuk menjalankan cadangan rsync misalnya di mana sinkronisasi harus berjalan untuk waktu yang lama dan Anda tidak ingin meninggalkan sesi Anda berjalan.
DanteAlighieri
13

Jika mereka berada di direktori yang sama dengan skrip Anda yang berisi:

./a.sh > /dev/null 2>&1 &
./b.sh > /dev/null 2>&1 &

Pada &akhirnya inilah yang membuat skrip Anda berjalan di latar belakang.

Bagian > /dev/null 2>&1ini tidak perlu - ini mengalihkan aliran stdout dan stderr sehingga Anda tidak perlu melihatnya di terminal, yang mungkin ingin Anda lakukan untuk skrip yang berisik dengan banyak keluaran.

Michael Chinen
sumber
7

Jalankan di subkulit untuk menghapus notifikasi dan menutup STDOUT dan STDERR:

(&>/dev/null script.sh &)
Tom Hale
sumber
Ini adalah satu-satunya jawaban yang juga tidak mencetak log pekerjaan latar belakang sebagai [1] + 54765 done <emacs>terima kasih
alper
2

Jika Anda ingin menjalankan script kickstart di linux Anda harus menjalankannya seperti di bawah ini.

sh /tmp/script.sh > /dev/null 2>&1 < /dev/null &
SARAT CHANDRAN
sumber
1
nohup sh -x runShellScripts.sh &
vaquar khan
sumber
apa yang -xdilakukan?
alper
0

Contoh ini berfungsi dengan baik:

nohup sh prog.sh proglog.log 2> & 1 &

Untuk loop Anda bisa menggunakan seperti ini:

untuk saya di {1..10}; lakukan sh prog.sh; tidur 1; selesai prog.log 2> & 1 &

Ia bekerja di latar belakang dan tidak menunjukkan keluaran apa pun.

Ramin Ismayilli
sumber