GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana saya bisa sepenuhnya mencatat semua tindakan skrip bash?

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:

  1. 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.

  2. 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.

  3. exec 1>log.out 2>&1

    Redirect stdout untuk mengajukan log.out lalu redirect stderr ke stdout . Perhatikan bahwa urutan itu penting ketika Anda ingin mereka pergi ke file yang sama. stdout harus dialihkan sebelum stderr dialihkan ke stdout .

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.


Linux
  1. Bagaimana cara menyorot skrip Bash di Vim?

  2. Bagaimana saya bisa dengan cepat menjumlahkan semua angka dalam sebuah file?

  3. Cara gzip semua file di semua sub-direktori di bash

  1. Bagaimana saya bisa menguji skrip Bash saya pada versi Bash yang lebih lama?

  2. Jalankan semua skrip shell di folder

  3. Bagaimana saya bisa menemukan semua file yang di-hardlink pada sistem file?

  1. Bagaimana Cara Memeriksa Apakah Bash Dapat Mencetak Warna?

  2. Cara menggemakan Baris Baru di Bash Shell Script

  3. Bagaimana cara menambahkan stempel waktu ke log skrip bash?