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>&2Menyimpan 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 3Pulihkan deskriptor file untuk sinyal tertentu. Biasanya tidak diperlukan karena harus dipulihkan saat sub-shell keluar.
-
exec 1>log.out 2>&1Redirect
stdoutuntuk mengajukanlog.outlalu redirectstderrkestdout. Perhatikan bahwa urutan itu penting ketika Anda ingin mereka pergi ke file yang sama.stdoutharus dialihkan sebelumstderrdialihkan 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.