Tcsh ile gerçek sonrası uzaktan nohup


11

Uzun vadeli (hafta?) Bir işlem çalıştıran bir xterm tcsh örneği var. Altında çalışmakta olan Xvnc sunucusu yabani otlarda dışarı çıktı; % 100 CPU tüketiyor ve yanıt vermiyor. (Bu bilinen bir hatadır ve kurtarılamaz olduğunu biliyorum .)

Uzun vadeli süreç şu anda stdout'u engelliyor.

Altta yatan bir süreci - tcsh, xterm, her neyse - öldürmenin ve bu uzun vadeli süreci devam ettirebilmemin bir yolu var mı?

(Lütfen, hakkında cevap yok screen. Biliyorum. Bu benim sürecim değil; bu bir kullanıcı. Öğrenmeyecekler.)

Yanıtlar:


17

Bu yayın yardımcı olabilir. Öneri:

  1. süreci arka planla (Ctrl-Z, sonra bg ile )
  2. run -h% [jobid] (büyük olasılıkla bir bash-ism, dolayısıyla tcsh için çevirmeniz gerekir)

Kötü haber , tabii ki, yani bg zaten backgrounded olabilir ... süreç içinde çalışan aynı kabukta yapılması gerekir ... ama.

Çok kötü haber olmasıdır disown çağrısı aynı kabuk yapılması gerekebilir. Bu durumda, evet, berbatsın. Ama emin değilim, belki de kök onu zorla kesebilir.

Hmm. Olası iyi haber - tcsh, reddetme işlemini otomatik olarak yapar:

Tcsh normal olmayan bir şekilde çıkarsa, arka planda çalışan işleri otomatik olarak kapatır.

Dolayısıyla, uzun vadeli süreciniz zaten arka plandaysa, tcsh üst öğesini öldürmek devam etmesine izin vermelidir. İşlem şimdi başlangıç ​​terminalinden ayrılmıştır. (Değilse, yukarıdaki "kötü haber" e bakın.)

Ne yazık ki, ekran değil, bu yüzden gerçek bir yeniden bağlanma yok. Belki gdb ile taklit edebilirsiniz (yine, ilk bağlantıdan):

[...] bazı kirli hack'lerle, 'stdout / stderr / stdin' sürecini yeniden açmak imkansız değildir.

Böylece yine de boş bir ekran penceresi oluşturabilirsiniz (örneğin uyku çalışır).

Ve sonra işleme eklemek için örneğin gdb kullanın, close (0)
call close (1)
call close (2)
call open ("/ dev / pts / xx", ...)
call dup (0)
dup (0)
ayırmayı çağır

Sürecin çıktısı ekrana gider. Bu ekran terminaline bağlanmaz, örneğin [sic] işlemi değil, “uyku” komutunu öldürür, fakat bu OP için yeterli olabilir.

Bu süreçte de "dup (1) çağrısı" ve "dup (2) çağrısı" olmaması gerektiğini merak ediyorum ...


Evet, bu bir ön plan, sanırım berbatım.
wfaulk

Evet. ama dediğin gibi, bu senin sürecin değil, senin hatan değil. üzgünüm dağınıklıkla sıkışıp kaldın tho.
quack quixote

2
Bu tamamen kıçımı kurtardı. Başlangıçta hakkında yayınlanan aynı sorunla karşılaştım, bu X sunucusu (ve sanırım, aradaki xterm) sıkıştığında işlem STDOUT üzerinde engelleme oldu. Görünüşe göre yakın STDOUT dışında hiçbir şey yapmam gerekmiyordu. Bu çıktı önemsizdi; gerçek veriler bir yerde bir günlük dosyasındadır. Böylece gdb ile bağlanmayı, "close close (1)" komutunu çalıştırmayı ve sonra "cont" i çalıştırmayı başardım ve tekrar ilerliyor. Çok teşekkürler!
wfaulk

ha! ilginç. herşeyi çözer mi? acayiplik. tho yardımcı oldu sevindim!
quack quixote

2
Bir ön plan işlemine "Ctrl-Z" göndermenin ve pidine SIGSTOP göndermenin aynı şey olduğunu belirtmek faydalı olabilir. (SIGCONT işlemi tekrar başlatır.) Bunun aynı durumdaki başkaları için yararlı olup olmayacağını bilmiyorum, ancak, hızlı testimde SIGSTOP göndererek SIGCONT ve ardından "Ctrl-Z" kopyalarını takip ediyor bg.
wfaulk

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.