เพราะวิธีที่ผู้ให้บริการทำสิ่งที่ฉันต้องใช้ระบบสำหรับบริการ
บริการนี้มีไฟล์ที่เรียกใช้ซึ่งจะเรียกใช้และไพพ์ลงในไฟล์รันที่สอง แต่ฉันใช้แพ็กเกจหลาม (ที่ได้รับ) ที่บันทึกไปยัง stderr แทนที่จะเป็น stdout และฉันไม่สามารถทำสิ่งที่ฉันต้องการได้
ดังนั้นฉันจึงมีสคริปต์รันสำหรับบริการของฉัน:
#!/bin/sh
cd ~/webapp/PriceList
exec python3.4 ~/webapp/PriceList/src/main.py
ซึ่งถูกไพพ์ไปที่การรันของระบบการบันทึก:
#!/bin/sh
exec multilog t ./main
แต่ท่อไม่ได้เชื่อมต่อ stderr (ตามที่คาดไว้) ดังนั้นหลังจาก googling ฉันผนวกการเปลี่ยนเส้นทางไปยังการทำงานของฉัน:
#!/bin/sh
cd ~/webapp/PriceList
exec python3.4 ~/webapp/PriceList/src/main.py 2>&1
แต่สิ่งนี้ไม่ช่วยแก้ปัญหาของฉัน: ผลลัพธ์ของฉัน (ไปยัง stdout โดยใช้การพิมพ์ pythons) จะถูกบันทึกตามที่คาดไว้ เอาต์พุต stderr ไม่ถูกบันทึก
หากฉันเปลี่ยนเส้นทางของสคริปต์ที่แก้ไขให้เป็นสองไฟล์แสดงว่าไม่มีการเปลี่ยนเส้นทาง (stderr ยังคงอยู่ใน stderr) ฉันจะต้องแก้ไขการเปลี่ยนเส้นทางให้ทำงานได้อย่างไร
dup2()
ในรหัส ความคิดใดที่ผลลัพธ์ stderr จะเป็นอย่างไร ความคิดอื่น: บางทีไฟล์เรียกใช้ของ hoster ของคุณกำลังเปลี่ยนเส้นทาง stderr ด้วยวิธีนี้ก่อนเริ่มรหัสของคุณ
import sys; print("Hello, stderr", file=sys.stderr)
แจ้งว่าแน่ใจ
exec python3.4 ~/webapp/PriceList/src/main.py > out.log 2> err.log
และดูไฟล์บันทึกนี้
exec ... 2>&1
ไม่ได้รวมข้อผิดพลาดมาตรฐานในมาตรฐานออก ดังนั้นอย่างอื่นที่ผิดพลาด