bởi vì cách mà con gà trống của tôi làm những việc mà tôi phải sử dụng một hệ thống cho các dịch vụ.
Dịch vụ này có một tệp chạy mà nó thực thi và chuyển thành một tệp chạy thứ hai. Nhưng tôi sử dụng gói python (đã cho) ghi vào stderr thay vì stdout và tôi không thể lấy nó để làm những gì tôi muốn.
Vì vậy, tôi có một kịch bản chạy cho dịch vụ của mình:
#!/bin/sh
cd ~/webapp/PriceList
exec python3.4 ~/webapp/PriceList/src/main.py
được dẫn vào hệ thống ghi nhật ký:
#!/bin/sh
exec multilog t ./main
Nhưng đường ống không kết nối stderr (như mong đợi). Vì vậy, sau khi googling tôi đã thêm một chuyển hướng vào chạy của tôi:
#!/bin/sh
cd ~/webapp/PriceList
exec python3.4 ~/webapp/PriceList/src/main.py 2>&1
Nhưng điều này không giải quyết được vấn đề của tôi: Đầu ra của riêng tôi (để xuất bản bằng cách sử dụng in pythons) được ghi lại như mong đợi. Đầu ra stderr không được ghi lại.
Nếu tôi chuyển hướng bản thảo đã sửa đổi của mình thành hai tệp, nó cho thấy rằng không có chuyển hướng (stderr vẫn còn trên stderr). Làm thế nào để tôi phải sửa đổi chuyển hướng của tôi để làm việc?
dup2()
trong mã. Bất cứ ý tưởng nơi đầu ra stderr đang đi? Một suy nghĩ khác: có lẽ tệp chạy của hoster của bạn đang chuyển hướng stderr theo cách này trước khi bắt đầu mã của bạn.
import sys; print("Hello, stderr", file=sys.stderr)
chắc chắn.
exec python3.4 ~/webapp/PriceList/src/main.py > out.log 2> err.log
và hãy xem logfiles này.
exec ... 2>&1
thực sự tham gia lỗi tiêu chuẩn vào tiêu chuẩn ra. Vì vậy, một cái gì đó khác là khủng khiếp.