Đường ống đầu ra của tập lệnh bash sau khi chuyển hướng stderr [đã đóng]


9

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?


5
exec ... 2>&1thự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.
thrig

3
Bất kỳ cơ hội nào kịch bản python đang đóng stderr và mở lại dưới dạng tệp? Tìm kiếm một cuộc gọi đến 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.
Edward Falk

1
Bạn có thể hoàn toàn xác nhận rằng văn bản đang được gửi đến stderr? Thay thế tập lệnh bằng một câu nói import sys; print("Hello, stderr", file=sys.stderr)chắc chắn.
rosuav

3
Thực sự stderr? Hãy thử điều này exec python3.4 ~/webapp/PriceList/src/main.py > out.log 2> err.logvà hãy xem logfiles này.
ingopingo

2
Điều gì xảy ra nếu bạn sử dụng bash thay vì sh?
Luciano Andress Martini

Câu trả lời:


0

Vui lòng thử:

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

tức là: exec 2>&1trên một dòng riêng biệt, yêu cầu chuyển hướng stderr đến cùng một thiết bị xuất chuẩn (thiết bị đầu cuối của bạn? hoặc gửi thư nếu trong crontab?), theo sau là cd & exec để thay thế quy trình hiện tại bằng python3.2. Lưu ý rằng tôi đã chuyển sang bash thay vì sh, vì tính di động thấp hơn nhưng thường có độ tin cậy tốt hơn nhiều. Nếu điều này hoạt động, thật tuyệt, nếu không một số người hiểu biết tốt hơn sẽ bước vào. (Tôi không có thời gian để nghiên cứu ngay về điều này)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.