Bagaimana cara mengirim semua output ke `logger` di shell POSIX?
10
Saya ingin mencatat keluaran standar dan kesalahan standar secara terpisah dalam .xprofilemenggunakan logger. Di Bash saya pikir itu akan terlihat seperti ini:
Tidak ada yang setara dengan POSIX. Anda hanya dapat melakukan pengalihan dengan exec, bukan garpu. Sebuah pipa membutuhkan garpu, dan cangkangnya menunggu anak selesai.
Salah satu solusinya adalah dengan meletakkan semua kode Anda dalam suatu fungsi.
(Ini juga mencatat kesalahan apa pun dari instance stdout dari logger ke instance stderr. Anda dapat menghindari ini dengan mengacak file deskriptor yang lebih banyak.)
Jika Anda ingin induk shell keluar bahkan jika loggerprosesnya masih berjalan, letakkan &di akhir loggerdoa.
Itu akan muncul di syslog sebagai dua entri (keluar & err) untuk keseluruhan skrip. Contoh dalam pertanyaan akan memiliki satu (atau dua) entri per perintah.
DarkHeart
@DarkHeart Saya tidak mengerti komentar Anda. Kode dalam pertanyaan dan kedua solusi yang saya usulkan menjalankan jumlah instance loggeryang sama dan memberikan input yang sama untuk masing-masingnya.
... yang tidak jauh berbeda, kecuali memungkinkan mktempuntuk memilih nama file untuk Anda. Ini bekerja karena proses substitusi sama sekali tidak ajaib dan bekerja dengan cara yang sangat mirip dengan perintah substitusi . Alih-alih mengganti ekspansi dengan nilai perintah yang dijalankan di dalamnya seperti yang dilakukan penggantian substitusi , substitusi proses menggantinya dengan nama tautan filesystem di mana output dapat ditemukan.
Sementara shell POSIX tidak memberikan akibat langsung pada hal seperti itu, meniru itu sangat mudah dilakukan. Yang perlu Anda lakukan adalah membuat file, mencetak namanya ke standar dari substitusi perintah, dan di latar belakang jalankan perintah Anda yang akan menghasilkan file itu. Sekarang Anda bisa mengarahkan kembali ke nilai ekspansi itu - persis seperti yang Anda lakukan dengan substitusi proses. Jadi shell POSIX menyediakan semua alat yang Anda butuhkan tentu saja - yang diperlukan hanyalah Anda menempatkannya untuk digunakan dengan cara yang sesuai untuk Anda.
Kedua versi di atas memastikan bahwa mereka menghancurkan tautan sistem file ke pipa yang mereka buat / gunakan sebelum menggunakannya. Ini berarti tidak ada pembersihan yang diperlukan setelah fakta, dan, yang lebih penting, aliran mereka hanya tersedia untuk proses yang awalnya membukanya - dan karenanya tautan sistem file mereka tidak dapat digunakan sebagai sarana untuk mengintai / membajak aktivitas logging Anda. Untuk meninggalkan fs-link mereka di sistem file adalah lubang keamanan potensial.
Cara lain adalah membungkusnya. Itu bisa dilakukan dari dalam skrip.
@ l0b0 - Saya baru saja akan memperbarui jenis lain seperti ini ... Ini lebih umum, dan saya akhirnya memberikannya kemampuan untuk menangani beberapa opsi seperti yang terkait dengan i / o deskriptor / file.
mikeserv
@ l0b0 - jika Anda ingin menggunakan mktempdan perintah non-standar lainnya, bisa jadi: _log()( p=; mkfifo "${p:=$(mktemp -u)}"; printf %s "$p"; exec <&- >&- <>/dev/null >&0; { rm "$p"; logger --priority user."$1" --tag "${0##*/}"; } <"$p" &). Saya menulisnya menggunakan bahasa perintah sepenuhnya portabel dalam semua cara - dengan pengecualian Anda sendiri. Juga, basenamebukan utilitas yang sangat berguna. "${0##*/}"keduanya lebih kuat dan lebih cepat.
mikeserv
Saya mengubahnya karena saya hanya membutuhkannya untuk bekerja pada platform modern; masalah utama adalah bahwa .xprofilememiliki akan dieksekusi dengan sh.
l0b0
1
@ Kartu Memori - hanya satu menit dan saya akan mencoba untuk memilah bagian pertama dari pertanyaan, tetapi jawaban untuk yang kedua adalah ya: kasus tepi zshw / multios diaktifkan. Adapun bagian pertama: { this; can\'t; happen; before; } < this. Apakah itu membantu?
logger
yang sama dan memberikan input yang sama untuk masing-masingnya.Substitusi perintah / proses POSIX
Anda harus dapat menggunakannya seperti:
Berikut adalah versi yang menggunakan
mktemp
perintah:... yang tidak jauh berbeda, kecuali memungkinkan
mktemp
untuk memilih nama file untuk Anda. Ini bekerja karena proses substitusi sama sekali tidak ajaib dan bekerja dengan cara yang sangat mirip dengan perintah substitusi . Alih-alih mengganti ekspansi dengan nilai perintah yang dijalankan di dalamnya seperti yang dilakukan penggantian substitusi , substitusi proses menggantinya dengan nama tautan filesystem di mana output dapat ditemukan.Sementara shell POSIX tidak memberikan akibat langsung pada hal seperti itu, meniru itu sangat mudah dilakukan. Yang perlu Anda lakukan adalah membuat file, mencetak namanya ke standar dari substitusi perintah, dan di latar belakang jalankan perintah Anda yang akan menghasilkan file itu. Sekarang Anda bisa mengarahkan kembali ke nilai ekspansi itu - persis seperti yang Anda lakukan dengan substitusi proses. Jadi shell POSIX menyediakan semua alat yang Anda butuhkan tentu saja - yang diperlukan hanyalah Anda menempatkannya untuk digunakan dengan cara yang sesuai untuk Anda.
Kedua versi di atas memastikan bahwa mereka menghancurkan tautan sistem file ke pipa yang mereka buat / gunakan sebelum menggunakannya. Ini berarti tidak ada pembersihan yang diperlukan setelah fakta, dan, yang lebih penting, aliran mereka hanya tersedia untuk proses yang awalnya membukanya - dan karenanya tautan sistem file mereka tidak dapat digunakan sebagai sarana untuk mengintai / membajak aktivitas logging Anda. Untuk meninggalkan fs-link mereka di sistem file adalah lubang keamanan potensial.
Cara lain adalah membungkusnya. Itu bisa dilakukan dari dalam skrip.
Itu pada dasarnya akan memungkinkan skrip Anda untuk memanggil dirinya sendiri jika belum dan membuat Anda direktori kerja di temp untuk boot.
sumber
mktemp
dan perintah non-standar lainnya, bisa jadi:_log()( p=; mkfifo "${p:=$(mktemp -u)}"; printf %s "$p"; exec <&- >&- <>/dev/null >&0; { rm "$p"; logger --priority user."$1" --tag "${0##*/}"; } <"$p" &)
. Saya menulisnya menggunakan bahasa perintah sepenuhnya portabel dalam semua cara - dengan pengecualian Anda sendiri. Juga,basename
bukan utilitas yang sangat berguna."${0##*/}"
keduanya lebih kuat dan lebih cepat..xprofile
memiliki akan dieksekusi dengansh
.zsh
w / multios diaktifkan. Adapun bagian pertama:{ this; can\'t; happen; before; } < this
. Apakah itu membantu?