Uygulamamı öldürmeden nohup.out dosyası nasıl döndürülür


10

Benim nohup.outdosya hızla büyüyor.

Arka planda bir uygulama çalıştırıyorum, nohup.outdosya yazıyor ,

şimdi nohup.outbenim uygulama öldürmeden dosyayı döndürmek gerekiyor . Bu yapılabilir mi?


Kopyalayın, ardından kısaltın.
Jenny D

Önerdiğiniz bu iki işlem arasında bazı değerli günlük girişlerini kaybedebilir. Bunu tavsiye etmem.
Cleankod

Yanıtlar:


6

Flog ile birlikte bir göz atmalısınız logrotate. Eğer uygulama çıkışınızı SIGHUPbuna bağlarsanız, çalışan uygulamanızı öldürmek zorunda kalmadan flog işlemini yapabilirsiniz.

flog (dosya kaydedici), STDIN'den girişi okuyan ve bir dosyaya yazan bir programdır.

SIGHUP alınırsa, dosya, günlük dönüşüne izin verecek şekilde yeniden açılacaktır [bkz. RH üzerinde logrotate (8).]

Günlük dosyası yalnızca flog döndürmenin gerçekleştiğini algılarsa (yani eski dosya gitti veya inode değişti) yeniden açılır. flog son derece küçüktür (500 bayttan az bellek alanı.)


Nohup, nohup.out yerine bir boru kullanabilir mi?
Brian Minton

1
Man sayfasına göre nohup.out dışında bir dosyaya dosya yönlendirmesi (>) kullanabilirsiniz:To save output to FILE, use 'nohup COMMAND > FILE'
jas_raj

4

Döndüremezsiniz. >nohup.outDosyadaki tüm içeriği silecek komutla kısaltabilirsiniz .

Çıktıyı kaydetmeniz gerekiyorsa, önce dosyayı kopyalayıp kısaltabilirsiniz. Ancak, dosyayı kopyaladıktan sonra ancak kesmeden önce çıktının yazılabileceği bir yarış için küçük bir pencere var. Bu pencere sırasında yazılan çıktılar sonsuza kadar kaybolacaktır.


1
Ben kesilen dosya tanıtıcısı kapatılana kadar disk üzerinde herhangi bir alan boşaltmak olmaz inanıyorum.
symcbean

@symcbean İnancınız yanlış. Dosyanın kesilmesi, alanı hemen boşaltır.
kasperd

Logrotate copytruncate hile yapmalıdır.
user9517

@Iain Açıkladığım adımlar copytruncatein ile eşdeğerdir logrotate. Ancak nohup.outnadiren bir cron işini dönecek şekilde yapılandıracağınız türden bir dosyadır.
kasperd

2

Yapamazsın.

Dosyanın bağlantısını kaldırabilirsiniz (rm) ancak verilerin disk üzerinde hala bir ayak izi vardır ve açık bir dosya tanıtıcısı olduğu sürece yazmaya devam edecektir.

Dosyayı yeniden adlandırabilirsiniz - ancak yine de bu dosyanın yazılmasını engellemez (ancak arka plan işlerine düzenli olarak başlıyorsanız, yeni olanlar aynı dosyaya yazacaktır).

Gerçekten, işin çıktısını açıkça bunu ele almak için tasarlanmış bir şeye yönlendirmelisiniz (örn. Apache rotatelogs ).


logrotate copytruncate kimse?
user9517

Bu tamamen nohup'ın nohup.out'a satır satır eklenmesine veya nohup.out'un konumuna bir işaretçi tutup tutmamasına bağlıdır. Örnek için serverfault.com/questions/221337/… adresine bakın .
pepoluan

2

Buna çok geç kaldığımdan emin değilim. Ama şimdi bu foruma rastlayan diğerleri için, flog veya başka bir şey denemek zorunda kalmadım.

Benim işim şöyle başlıyor:

nohup <my process> &

Bu işimi başlatır ve bu dizindeki bir nohup.out öğesine eklemeye başlar.

Tek yapmam gereken, genellikle dağıtımla birlikte gelen bir logrotate kurmak ve bunun gibi bir şey yapılandırmaktı. /etc/logrotate.conf

~/my abosolute path/nohup.out {
    size 1024k
    copytruncate
    rotate 100
    maxage 100
}

Ve işe yaradı !! nohup.out yeni dosya aynı dosyaya eklenirken kesiliyordu. Süreç de ölmedi. Ve bunun gibi yeni bir nohup.out nohup.out-20190528oluşturuldu.

Bu yardımcı olur umarım.


1

Logrotate, normal döndürme (ve ayarlanmışsa sıkıştırma) şemasına kopyalandıktan sonra belirtilen dosyanızı kesecek (boşaltacaktır) bir copytruncate seçeneğine sahiptir.

   copytruncate
          Truncate  the  original log file in place after creating a copy,
          instead of moving the old log file and optionally creating a new
          one,  It  can be used when some program can not be told to close
          its logfile and thus might continue writing (appending)  to  the
          previous log file forever.  Note that there is a very small time
          slice between copying the file and truncating it, so  some  log-
          ging  data  might be lost.  When this option is used, the create
          option will have no effect, as the old log file stays in  place.

Gönderen logrotate manpage .


1

Bunun gibi bir şey yapabilirsiniz:

cp nohup.out nohup.out.save # save it somewhere
echo "" > nohup.out

Uygulamanızı öldürmeniz gerekmez.

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.