Saya ingin mengambil SEMUA data log, baik dengan pesan kesalahan, dari output skrip saya, dan mengarahkan semuanya ke file log.
Saya punya skrip seperti di bawah ini:
#!/bin/bash
(
echo " `date` : part 1 - start "
ssh -f admin@server.com 'bash /www/htdocs/server.com/scripts/part1.sh logout exit'
echo " `date` : sleep 120"
sleep 120
echo " `date` : part 2 - start"
ssh admin@server.com 'bash /www/htdocs/server.com/scripts/part2.sh logout exit'
echo " `date` : part 3 - start"
ssh admin@server.com 'bash /www/htdocs/server.com/scripts/part3.sh logout exit'
echo " `date` : END"
) | tee -a /home/scripts/cron/logs
Saya ingin melihat semua tindakan dalam file /home/scripts/cron/logs
Tapi saya hanya melihat ini yang saya berikan setelah perintah echo.
Bagaimana cara check in log apakah perintah SSH berhasil?
Saya perlu mengumpulkan semua data log. Saya memerlukan ini untuk memantau hasil setiap perintah dalam skrip saya, untuk lebih menganalisis apa yang terjadi ketika skrip gagal.
Jawaban:
Saya biasanya meletakkan sesuatu yang mirip dengan yang berikut di awal setiap skrip (terutama jika itu akan dijalankan sebagai daemon):
Penjelasan:
exec 3>&1 4>&2
Menyimpan deskriptor file sehingga mereka dapat dikembalikan ke apa pun mereka sebelum redirection atau digunakan sendiri untuk output apa pun mereka sebelum redirect berikut.
trap 'exec 2>&4 1>&3' 0 1 2 3
Kembalikan deskriptor file untuk sinyal tertentu. Biasanya tidak diperlukan karena mereka harus dikembalikan ketika sub-shell keluar.
exec 1>log.out 2>&1
Redirect
stdout
ke filelog.out
lalu redirectstderr
kestdout
. Perhatikan bahwa urutannya penting ketika Anda ingin mereka membuka file yang sama.stdout
harus dialihkan sebelumstderr
diarahkan kestdout
.Sejak saat itu, untuk melihat output di konsol (mungkin), Anda dapat mengarahkan ke
&3
. Sebagai contoh,akan pergi ke mana
stdout
pun diarahkan, mungkin konsol, sebelum mengeksekusi baris 3 di atas.sumber
trap 'exec 2>&4 1>&3' 0 1 2 3 RETURN
. RETURN pseudo sigspec mengembalikan deskriptor file setiap kali fungsi shell atau skrip dieksekusi dengan. atau sumber bawaan selesai dieksekusi. Untuk ini (dan untuk alasan lain) dalam skrip saya, saya menambahkan sebagai 2 baris terakhir:return
&exit 0
- Hanya 2 sen saya, pujian untuk Anda @nicerobot!trap
sinyal terlihat sedikit aneh. Biasanya Anda akan ingin memasukkan15
juga.untuk mendapatkan keluaran ssh ke logfile Anda, Anda harus mengarahkan ulang
stderr
kestdout
. Anda dapat melakukan ini dengan menambahkan2>&1
setelah skrip bash Anda.seharusnya terlihat seperti ini:
ketika ini tidak menampilkan mesages dalam urutan yang benar, cobalah untuk menambahkan subkulit lain:
sumber
( ... ) |& tee output.log
Ketika saya membaca pertanyaan Anda, Anda tidak ingin mencatat output, tetapi seluruh urutan perintah, dalam hal ini, jawaban lain tidak akan membantu Anda.
Aktifkan skrip shell dengan -x untuk menampilkan semuanya:
sh -x foo.sh
Log ke file yang Anda inginkan dengan:
sh -x foo.sh >> /home/scripts/cron/logs
sumber
Di bash, Anda bisa meletakkan
set -x
dan akan mencetak setiap perintah yang dieksekusi (dan variabel bash) setelah itu. Anda dapat mematikannya denganset +x
.Jika Anda ingin menjadi paranoid, Anda dapat memasukkan
set -o errexit
skrip Anda. Ini berarti skrip akan gagal dan berhenti jika satu perintah mengembalikan kode keluar bukan nol, yang merupakan cara standar unix untuk memberi sinyal bahwa ada yang tidak beres.Jika Anda ingin mendapatkan log lebih bagus, Anda harus melihat pada
ts
dimoreutils
paket debian / ubuntu. Ini akan mengawali setiap baris dengan cap waktu dan mencetaknya. Jadi Anda bisa melihat ketika sesuatu terjadi.sumber
Mengikuti apa yang orang lain katakan, set manual adalah sumber yang bagus. Saya meletakkan:
Di bagian atas skrip, saya ingin melanjutkan, atau
set -ex
jika harus keluar karena kesalahan.sumber
ssh -vv
?