Çalışan bir işlemin çıkış yeniden yönlendirmesi nasıl değiştirilir?


11

Çıktıların nasıl yönlendirileceğini ve bash'da nasıl bastırılacağını biliyorum . Şimdi, yanlışlıkla yeniden yönlendirme kısmını komuta (örn. 2>&1Veya > /tmp/mystdout) eklemeyi unuttuğumu ve arka plan işlemimin zaten bir süredir çalıştığını varsayalım , hala nereye değişebilir stdoutve stderryazılıyor olabilirim? Gerçekten uygulamayı öldürmek ve yeniden başlatmak istemiyorum.

Gilles'in yorumunda sorduğu gibi daha spesifik olmak gerekirse , özellikle bu senaryolarda onunla uğraşmak istiyorum:

  • yanlış çıktı dosyası
  • yönlendirmek unuttum stderriçinstdout

veya ikisinin bir kombinasyonu

Ben Apache çalışan var ve dosya tanımlayıcıları görebilirsiniz :

/proc/8019/fd/0 -> /dev/null
/proc/8019/fd/1 -> /dev/null
/proc/8019/fd/2 -> /var/log/apache2/error.log

Başka bir terminalle değiştirilsin mi? Yoksa bir dosyaya mı? Geçerli terminale veya yeni bir ekran oturumuna eklemekten
Gilles 'SO- kötü olmayı bırak'

Yanıtlar:


8

Bunu reredirect ( https://github.com/jerome-pouiller/reredirect/ ) kullanarak yapabilirsiniz .

reredirect -m /dev/null <PID>

İşleminizin ilk çıktısını daha sonra aşağıdaki gibi bir şey kullanarak geri yükleyebilirsiniz:

reredirect -N -O <M> -E <N> <PID>

( <M>ve <N>önceki reredirect lansmanı ile sağlanır).

reredirect READMEayrıca başka bir komuta nasıl yönlendirileceğini veya yalnızca stdout veya stderr'in nasıl yönlendirileceğini açıklar.


3

Bu mümkün değil. Ya da en azından kolay değil. Sürece gdb ekleme ve gdb'de bununla uğraşma şansınız olabilir, ancak bu, başarı kadar kolay çökmelere yol açabilir.



Paylaşmaktan çekinmeyin, cevabını oylayacağım :)
Dennis Kaarsemaker


1
Pek değil. Diğer hataya bağlı tüm araçlar, başka bir terminal / ekran oturumuna bağlanmakla ilgilidir. Başka bir dosyaya yeniden yönlendirmekle ilgili değil. Yine de reptyr'i bir dosyaya yönlendirmek için yamalamak zor olmasa da.
Dennis Kaarsemaker

Biraz reptyr'ın kaynağına baktım ve cevabın "kolay değil" kısmına en çok katılıyorum. Bir süre sonra daha derin bir dalış yapabilir.
gertvdijk

2

Yeni geçerli terminalinize başka bir işlem eklemek için reptyr kullanmalısınız . Örneğin: yükleyip GNU kullanmak screenyarar ve içinde başlatacak reptyr"getir" Diğer sürecin yönlendirmeler (ve terminal kontrol) için komuta ve (yeni akım terminale ekleyebilirsiniz screensen başlattı eğer, sürecin reptyrgelen screen). Bunu bir screenoturumdan yapmanın avantajı , bir kez altında screen, bağlantıyı kesip yeniden bağlanmanın (örneğin, yerel oturumunuzu kapatma, eve gitme ve yeniden açma) kolay olmasıdır.


Cevabınız için teşekkürler, ancak terminal ayırma / perakendecilik hakkında soru sormadığım için durumumda bana yardımcı olmuyor. Lütfen sorumu ve spesifik örneği tekrar okuyun.
gertvdijk

ah, bu durumda: reptyr kodunu okuyun, sadece stdout veya stderr'i yeniden yönlendirmek için nasıl değiştirileceğini öğrenin. Ardından, yeni eklenen akışı gitmek istediğiniz yere yönlendiren başka bir kabuktan çalıştırın? (veya daha iyi, reptyr kaynağını kullanarak doğrudan yönlendirmeyi yapın)
Olivier Dulac
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.