Solusi 1:
Saya biasanya meletakkan sesuatu yang mirip dengan yang berikut di awal setiap skrip (terutama jika dijalankan sebagai daemon):
#!/bin/bash
exec 3>&1 4>&2
trap 'exec 2>&4 1>&3' 0 1 2 3
exec 1>log.out 2>&1
# Everything below will go to the file 'log.out':
Penjelasan:
-
exec 3>&1 4>&2
Menyimpan deskriptor file sehingga dapat dipulihkan ke apa pun sebelum pengalihan atau digunakan sendiri untuk menghasilkan apa pun sebelum pengalihan berikut.
-
trap 'exec 2>&4 1>&3' 0 1 2 3
Pulihkan deskriptor file untuk sinyal tertentu. Biasanya tidak diperlukan karena harus dipulihkan saat sub-shell keluar.
-
exec 1>log.out 2>&1
Redirect
stdout
untuk mengajukanlog.out
lalu redirectstderr
kestdout
. Perhatikan bahwa urutan itu penting ketika Anda ingin mereka pergi ke file yang sama.stdout
harus dialihkan sebelumstderr
dialihkan kestdout
.
Sejak saat itu, untuk melihat keluaran di konsol (mungkin), Anda cukup mengarahkan ke &3
. Misalnya,
echo "$(date) : part 1 - start" >&3
akan pergi ke mana saja stdout
diarahkan, mungkin konsol, sebelum mengeksekusi baris 3 di atas.
Solusi 2:
untuk mendapatkan output ssh ke file log Anda, Anda harus mengarahkan ulang stderr
ke stdout
. Anda dapat melakukannya dengan menambahkan 2>&1
setelah skrip bash Anda.
seharusnya terlihat seperti ini:
#!/bin/bash
(
...
) 2>&1 | tee ...
ketika ini tidak menampilkan pesan dalam urutan yang benar, coba tambahkan subkulit lain:
#!/bin/bash
((
...
) 2>&1) | tee ...
Solusi 3:
Saat saya membaca pertanyaan Anda, Anda tidak ingin mencatat hasilnya, 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
Masuk ke file yang Anda inginkan dengan:
sh -x foo.sh >> /home/scripts/cron/logs
Solusi 4:
Di bash, Anda dapat memasukkan set -x
dan itu akan mencetak setiap perintah yang dieksekusi (dan variabel bash) setelah itu. Anda dapat mematikannya dengan set +x
.
Jika Anda ingin menjadi paranoid, Anda dapat memasukkan set -o errexit
dalam skrip Anda. Ini berarti skrip akan gagal dan berhenti jika satu perintah mengembalikan kode keluar bukan nol, yang merupakan cara standar unix untuk menandakan bahwa ada yang tidak beres.
Jika Anda ingin mendapatkan log yang lebih bagus, Anda harus melihat ts
di moreutils
paket debian/ubuntu. Ini akan mengawali setiap baris dengan stempel waktu dan mencetaknya. Jadi, Anda dapat melihat kapan sesuatu terjadi.
Solusi 5:
Mengikuti apa yang dikatakan orang lain, manual yang ditetapkan adalah sumber yang bagus. Saya menempatkan:
#!/usr/bin/env bash
exec 1> command.log 2>&1
set -x
Di bagian atas skrip saya ingin melanjutkan, atau set -ex
jika harus keluar karena kesalahan.