Untuk beberapa mesin cloud yang saya luncurkan, saya mencoba masuk ke file tertentu, syslog, dan terminal / konsol.
Di bagian atas skrip pengaturan mesin / cloud-init saya, saya memiliki yang berikut:
#!/bin/bash
exec &> >(tee "/tmp/box-setup.log" | logger -t box-setup)
apt-get install -y some-package
Ini berfungsi dengan baik dalam mengirim output ke file dan syslog, tetapi tidak menyalurkan ke output ke terminal.
Secara umum tidak memiliki output terminal bukan masalah besar kecuali ketika saya debug dari konsol jarak jauh. Ketika itu terjadi, saya benar-benar buta karena konsol kosong ketika skrip bash dijalankan.
Apakah ada cara sederhana menggunakan bash
redirection atau apa pun untuk menyalurkan semua output (output standar bersama dengan kesalahan standar) ke file, syslog, dan terminal secara bersamaan?
Saya menjalankan Ubuntu 16.04.
sumber
exec &> >(tee /tmp/box-setup.log >(logger -t box-setup))
Anda mungkin ingin menyelesaikan masalah itu dengan cara yang berbeda: jalankan skrip bash Anda di latar belakang, dan jalankan
less /tmp/box-setup.log
dan tekan F untuk terus memperbarui layar saat baris ditambahkan ke file yang ditontonnya (sepertitail -f
).Jika menjalankan skrip di latar belakang merupakan masalah, gunakan
tmux
atauscreen
untuk membuat banyak sesi menjadi multipleks ke satu koneksi ssh. Gunakanless
perintah yang sama di shell lain.Masalah aslinya:
tee
dapat menyalin ke beberapa tujuan. Jadikan salah satu dari mereka terminal, menggunakan/dev/tty
file khusus. Saya pikir itu selalu mengacu pada tty mengendalikan proses saat ini. Atau mungkin lebih baik,/dev/stderr
karenatee
stderr masih terhubung ke stderr shell. (Ini memungkinkan Anda membungkam skrip dengan &> / dev / null).BTW, ini setara dengan tetapi lebih efisien daripada
(tee /dev/stderr | tee "/tmp/box-setup.log" | logger ...)
.Dimungkinkan untuk menggunakan beberapa kloning file-deskriptor untuk memberikan
tee
stdout skrip asli, daripada stderr.sumber
Cukup tambahkan
/dev/stderr
(pilihan Anda) sebagai outputtee
.Output standar dan kesalahan standar akan digabungkan. Tidak ada cara untuk memisahkan mereka jika Anda ingin mempertahankan pesanan mereka, yang biasanya diinginkan. Tidak masalah jika mereka berdua pergi ke tempat yang sama (misalnya terminal).
sumber
tee
stdout adalah pipa untuk logger, bukan terminal. Itustderr
pada titik itu masih terminal, berdasarkanexec &> >(tee /dev/stderr > /dev/null)
bekerja seperti yang diharapkan dalam shell interaktif.stderr
sepertinya ide yang lebih baik daripada ide saya/dev/tty
, karena memungkinkan Anda dengan mudah menutup skrip dengan pengalihan jika Anda mau.