Saya memiliki daemon khusus yang dikelola oleh pemula di server Ubuntu saya. Ini berfungsi dengan baik kecuali bahwa saya perlu menangkap (log) output daemon. The halaman bait resmi mengatakan bahwa saya dapat menggunakan console logged
untuk melakukan hal ini, tetapi file apa itu log ke?
Saya juga sudah membaca bahwa baitconsole logged
itu tidak lagi sahih . Saya saat ini menggunakan 0.3.9 (Hardy) tetapi akan meningkatkan ke 0.6.x (Lucid) dalam beberapa bulan. Jika console logged
sebenarnya tidak akan berfungsi dengan versi yang lebih baru, apa yang harus saya gunakan?
Jawaban:
Cuplikan ini akan menyalurkan output layanan Anda ke logger, sambil tetap memungkinkan Anda untuk menjalankan proses layanan (sehingga mengganti proses shell) sehingga pemula tidak menjadi bingung. Itu juga memastikan proses logger direparasi ke init, jadi itu bukan anak dari layanan Anda, dan itu menghindari meninggalkan cruft duduk-duduk di sistem file, meskipun itu perlu membuat fifo sementara.
Begini cara kerjanya:
mkfifo /tmp/myservice-log-fifo
cukup buat file khusus fifo (alias pipa bernama). Ketikman 7 fifo
untuk info lebih lanjut.( logger ... </tmp/myservice-log-fifo & )
mulai membaca logger dari fifo, di latar belakang. Parens menyebabkan proses logger untuk reparents untuk init, daripada tetap anak proses shell saat ini.exec >/tmp/myservice-log-fifo
mengalihkan stdout shell saat ini ke fifo. Sekarang kita memiliki deskriptor file terbuka untuk fifo itu, dan kita sebenarnya tidak memerlukan entri sistem file lagi ...rm /tmp/myservice-log-fifo
jadi kami akan menghapusnya.exec myservice 2>/dev/null
cukup menjalankan layanan dengan cara biasa. Stdout sudah menuju ke fifo, dan itu tidak akan berubah ketika program baru dijalankan.UPDATE:
set -e
tidak diperlukan karena Upstart menjalankan skrip dengan opsi ini secara default (lihat http://upstart.ubuntu.com/cookbook/#develop-scripts-using-bin-sh )sumber
set -e
?set -e
menyebabkan script untuk keluar segera jika perintah apapun gagal. Tanpa baris itu, skrip akan terus menjalankan perintah berikutnya dengan sia-sia (dan mungkin berbahaya).exec 2>&1
atasrm
baris, dan hapus2>/dev/null
dari baris terakhir.Untuk versi Ubuntu terbaru (12.04+), cukup gunakan
Dan output daemon (STDOUT & STDERR) akan ditambahkan ke
/var/log/upstart/<service>.log
http://upstart.ubuntu.com/cookbook/#console-log
sumber
Jika Anda menggunakan
console output
bait , dan kemudian menyalurkan output skrip Anda kelogger
(antarmuka perintah shell ke modul log sistem syslog (3)) maka itu akan berhasil.Sebagai contoh
akan masuk
/var/log/messages
Sebagai contoh
akan masuk
/var/log/messages
dan menandai setiap pesan denganmy-script
logger --help
untuk opsi penggunaan logger.(Saya menggunakan Amazon Linux AMI, yang berbasis Centos 5.x; YMMV)
sumber
logger
, bukan dari proses yang sebenarnya Anda inginkan untuk mengelola.Saya tidak mendapatkan
mkfifo
trik untuk bekerja dengan memuaskan; tampaknya tidak menangkap stderr, dan upaya untuk mengarahkan menyebabkan Upstart gagal tanpa kesalahan.Ini juga memiliki efek samping yang disayangkan membuat
logger
proses berkeliaran sebagai seorang anakinit
, sehingga informasi tentang siapa "yang memiliki" penebang hilang, dan siapa pun yang belum sadarmkfifo
akan menganggap itu adalah proses menjuntai yang dapat dibunuh.Alih-alih saya berakhir dengan solusi berikut, yang menyelesaikan semua masalah ini. Itu menyebabkan
logger
menjadi proses anak, sambil menjaga layanan sebagai proses root. Sayangnya, ini membutuhkan eksekusibash
, tetapi itu hanya terlihat kotor.Ini menggunakan trik yang mengarahkan ulang stdout dan stderr ke sebuah perintah. Karena kami mengeksekusi layanan di dalam
bash
perintah, ini memiliki efek samping mengganti shell dan secara ajaib menjadikan bash menjadi proses turunan dari layanan, seperti yang ditunjukkan olehps aufxw
:Untuk beberapa alasan perintah di atas harus dibungkus dengan a
bash -c
. Saya berasumsi ini karena Pemula hanya berpura-pura menjalankan skrip Anda melalui Bash, tetapi sebenarnya tidak. Jika ada yang bisa menyarankan cara untuk menghindari shell bash ekstra, itu akan luar biasa.sumber
exec bash -l << EOF
jadi tidak ada kerugian di sana.Ini jelek tapi sejauh ini yang terbaik yang saya temukan
exec / path / ke / server >> /tmp/upstart.log 2> & 1
sumber
Anda juga dapat mengarahkan output ke syslog, mis
Namun, pipeline dapat menyebabkan pemula untuk membingungkan PID dari proses logging dengan PID daemon.
sumber
expect fork
atauexpect daemon
bait. Atau Anda bisacat
mem-file pid ke dalam pesan log sebaliknya, saya kira.Alternatif lain menggunakan tee seperti:
untuk mendapatkan file baru, dan output syslog
sumber