Bisakah saya mengarahkan output ke file log dan latar belakang proses pada saat yang sama?

116

Bisakah saya mengarahkan output ke file log dan latar belakang proses pada saat yang sama?

Dengan kata lain, dapatkah saya melakukan hal seperti ini?

nohup java -jar myProgram.jar 2>&1 > output.log &

Atau, bukankah itu perintah hukum? Atau, apakah saya perlu memindahkannya secara manual ke latar belakang, seperti:

java -jar myProgram.jar 2>$1 > output.log
jobs
[CTRL-Z]
bg 1
Djangofan
sumber
2
Sudahkah Anda mencobanya? Kesalahan apa yang Anda dapatkan? Juga saya tidak yakin apakah Anda salah ketik, atau kesalahan dalam kode Anda. 2>$1mungkin seharusnya 2>&1.
Patrick

Jawaban:

171

Satu masalah dengan perintah pertama Anda adalah Anda mengarahkan stderr ke tempat stdout adalah (jika Anda mengubah $ ke a & seperti yang disarankan dalam komentar) dan kemudian, Anda mengarahkan stdout ke beberapa file log, tetapi itu tidak menarik sepanjang stderr yang diarahkan . Anda harus melakukannya dengan urutan lain, pertama kirim stdout ke tempat yang Anda inginkan, dan kemudian kirim stderr ke alamat stdout di

some_cmd > some_file 2>&1 &

dan kemudian Anda bisa melempar & ke untuk mengirimnya ke latar belakang. Pekerjaan dapat diakses dengan jobsperintah. jobsakan menunjukkan kepada Anda pekerjaan yang sedang berjalan, dan beri nomor. Anda kemudian dapat berbicara tentang pekerjaan menggunakan% diikuti dengan angka seperti kill %1atau lebih.

Juga, tanpa & di akhir Anda dapat menangguhkan perintah dengan Ctrlz, gunakan bgperintah untuk meletakkannya di latar belakang dan fgmembawanya kembali ke latar depan. Dalam kombinasi dengan jobsperintah, ini sangat kuat.

untuk memperjelas bagian di atas tentang urutan Anda menulis perintah. Misalkan stderr adalah alamat 1002, stdout adalah alamat 1001, dan file tersebut 1008. Perintah membaca dari kiri ke kanan, jadi hal pertama yang dilihatnya adalah milik Anda 2>&1yang memindahkan stderr ke alamat 1001, ia kemudian melihat > fileyang bergerak stdout ke 1008, tetapi tetap stderr di 1001. Itu tidak menarik semuanya menunjuk ke 1001 dan memindahkannya ke 1008, tetapi hanya referensi stdout dan memindahkannya ke file.
Sebaliknya, ia bergerak stdout ke 1008, dan kemudian bergerak stderr ke titik yang mengarah ke stdout, 1008 juga. Dengan cara ini keduanya dapat mengarah ke satu file.

Yakub Minshall
sumber
tampaknya tidak bisa menangkap pid setelah ini dengan$!
chovy
8
Juga patut dicatat: Anda dapat menggunakan &> file.outuntuk mengarahkan kembali stdin dan stdout ke file output, yang mengurangi kemungkinan kesalahan dengan meletakkan 2>&1tempat yang salah di baris perintah Anda.
Dan
14

Berhenti dengan <Ctrl+Z>dan melanjutkan di latar belakang bgsama dengan mengeksekusi dengan &di akhir perintah.

Jadi, untuk dijalankan di latar belakang dan redirect output:

java -jar myProgram.jar 2> errorOutput.log > output.log &

Jika Anda juga membutuhkan agar perintah ini tidak mati ketika Anda meninggalkan terminal, maka Anda harus menggunakannya nohup

RSFalcon7
sumber
Oh begitu. Anda mengatakan char '&' yang ditambahkan berlebihan?
Djangofan
Saya hanya mengutip halaman manualnya. Karena nohup akan mengeksekusi perintah di latar belakang, sepertinya berlebihan untuk mengeksekusi nohup sendiri di latar belakang
RSFalcon7
10
nohup tidak menjalankan perintah di latar belakang, Anda harus menambahkan secara eksplisit&
jlliagre
3
Setelah Anda memindahkan proses ke latar belakang bg, Anda dapat melepaskannya dari sesi dengan menjalankan disown, yang membuat proses tersebut tidak mati ketika Anda menutup terminal.
Koen.
14
java -jar myProgram.jar &> output.log &

Perhatikan bahwa &>mengarahkan stdout dan stderr ke output.log

Abhinav Bhatia
sumber
3
Penjelasan satu baris akan membuat jawabannya lengkap.
anaik
2
@ abhisheknaik96 menjalankan file jar dan mengarahkan kembali stdin dan stderr ke output.log dan menjadikannya proses latar belakang.
P Pang
2

Alih-alih menggunakan nohup Anda dapat menggunakan layar. Anda dapat melihat status program secara real time. Anda bahkan dapat mencatat semua output ke file. Ini berguna ketika Anda mengakses server melalui ssh tempat Anda keluar karena koneksi yang buruk atau tidak aktif. Setelah masuk, Anda dapat melanjutkan pekerjaan dari tempat Anda pergi. lihat ini dan ini untuk mengetahui secara detail.

Mani
sumber
1

The teeperintah cukup lazim juga.

nohup java -jar myProgram.jar | tee output.log &

trevorgrayson
sumber