Memipiskan output skrip bash setelah mengarahkan stderr [ditutup]

9

karena cara hoster saya melakukan hal-hal yang saya harus menggunakan sistem untuk layanan.

Layanan ini memiliki file run yang dijalankan dan disalurkan ke file run kedua. Tapi saya menggunakan paket python (diberikan) yang log ke stderr bukannya stdout dan saya tidak bisa mendapatkannya untuk melakukan apa yang saya inginkan.

Jadi saya punya skrip run untuk layanan saya:

#!/bin/sh
cd ~/webapp/PriceList
exec python3.4 ~/webapp/PriceList/src/main.py

yang disalurkan ke menjalankan sistem logging:

#!/bin/sh
exec multilog t ./main

Tetapi pipa tidak menghubungkan stderr (seperti yang diharapkan). Jadi setelah googling saya menambahkan pengalihan ke proses saya:

#!/bin/sh
cd ~/webapp/PriceList
exec python3.4 ~/webapp/PriceList/src/main.py 2>&1

Tapi ini tidak menyelesaikan masalah saya: Output saya sendiri (untuk stdout menggunakan cetak ular sanca) dicatat seperti yang diharapkan. Output stderr tidak dicatat.

Jika saya mengarahkan ulang naskah skrip yang saya modifikasi menjadi dua file, ini menunjukkan bahwa tidak ada pengalihan (stderr masih di stderr). Bagaimana saya harus mengubah pengalihan saya agar berfungsi?

xavor
sumber
5
exec ... 2>&1memang bergabung dengan standard error menjadi standard out. Jadi ada sesuatu yang salah.
thrig
3
Mungkinkah skrip python menutup stderr dan membukanya kembali sebagai file? Cari panggilan ke dup2()dalam kode. Tahu di mana output stderr adalah pergi? Pikiran lain: mungkin file run hoster Anda mengarahkan ulang stderr dengan cara ini sebelum memulai kode Anda.
Edward Falk
1
Bisakah Anda benar-benar mengkonfirmasi bahwa teks sedang dikirim ke stderr? Ganti skrip dengan skrip yang mengatakan import sys; print("Hello, stderr", file=sys.stderr)pasti.
rosuav
3
Benar-benar stderr? Coba ini exec python3.4 ~/webapp/PriceList/src/main.py > out.log 2> err.logdan lihat logfiles ini.
ingopingo
2
Apa yang terjadi jika Anda menggunakan bash, bukan sh?
Luciano Andress Martini

Jawaban:

0

Silakan coba:

#!/usr/bin/env bash
exec 2>&1
cd ~/webapp/PriceList
exec python3.4 ~/webapp/PriceList/src/main.py

yaitu: exec 2>&1pada baris yang terpisah, memberitahu untuk mengarahkan stderr ke hal yang sama stdout akan (terminal Anda? Atau mail jika di crontab?), diikuti oleh cd & exec untuk mengganti proses yang ada dengan python3.2. Perhatikan bahwa saya beralih ke bash, bukan sh, untuk portabilitas yang lebih rendah tetapi biasanya keandalannya jauh lebih baik. Jika ini berhasil, bagus, jika tidak beberapa orang berpengetahuan lebih baik akan masuk. (Saya tidak punya waktu untuk melakukan penelitian sekarang ini)

Olivier Dulac
sumber