Stderr'ı yeniden yönlendirdikten sonra bash betiğinin çıktısını borulama [kapalı]


9

benim evime işler yapma şekli nedeniyle hizmetler için bir sistem kullanmak zorundayım.

Bu hizmet, yürüttüğü ve ikinci bir çalışma dosyasına bağladığı bir çalışma dosyasına sahiptir. Ama stdout yerine stderr günlükleri (verilen) bir python paketi kullanın ve ben istediğimi yapmak için alamıyorum.

Yani benim hizmet için bir çalışma komut dosyası var:

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

günlük sisteminin çalıştırılmasına bağlanan:

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

Ancak boru stderr'ı bağlamaz (beklendiği gibi). Google'dan sonra koşuma bir yönlendirme ekledim:

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

Ama bu benim sorunumu çözmez: Kendi çıkışlarım (piton baskı kullanarak stdout için) beklendiği gibi günlüğe kaydedilir. Stderr çıkışı günlüğe kaydedilmez.

Değiştirilmiş çalışma kodumu iki dosyaya yeniden yönlendirirsem, yeniden yönlendirme olmadığını gösterir (stderr hala stderr'dadır). Çalışmak için yeniden yönlendirmemde nasıl değişiklik yapmam gerekir?


5
exec ... 2>&1gerçekten standart çıkış standart çıkış katılmak. Yani başka bir şey ters.
thrig

3
Python betiğinin stderr'ı kapatıp bir dosya olarak yeniden açması ihtimali var mı? Kodda bir çağrı arayın dup2(). Bir fikrin nerede Stderr çıkışı olan gidiş? Başka bir düşünce: belki de barındırıcınızın çalışma dosyası kodunuzu başlatmadan önce stderr'ı bu şekilde yönlendiriyor.
Edward Falk

1
Stderr'a metnin gönderildiğini kesinlikle teyit edebilir misiniz? import sys; print("Hello, stderr", file=sys.stderr)Emin olmak için komut dosyasını değiştirin .
rosuav

3
Gerçekten stderr? Bunu deneyin exec python3.4 ~/webapp/PriceList/src/main.py > out.log 2> err.logve bu günlük dosyalarına bir göz atın.
ingopingo

2
Sh yerine bash kullanırsanız ne olur?
Luciano Andress Martini

Yanıtlar:


0

Deneyin lütfen:

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

ie: exec 2>&1ayrı bir satırda, stderr'ın stdout'a (terminaliniz veya bir crontab'da ise posta?) gideceği şeyi, ardından varolan işlemi python3.2 olanıyla değiştirmek için cd & exec ile aynı şeye yönlendirilmesini söyleyin. Daha düşük bir taşınabilirlik, ancak genellikle çok daha iyi bir güvenilirlik için sh yerine bash'a geçtim. Bu işe yararsa, harika, daha bilgili bazı kişiler devreye girmezse. (Şu anda bu konuda araştırma yapmak için zamanım yok)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.