як повернути файл nohup.out, не вбиваючи мою програму


10

Мій nohup.outфайл швидко зростає.

Я запускаю програму у фоновому режимі, вона пише nohup.outфайл,

тепер мені потрібно обертати nohup.outфайл, не вбиваючи мою програму. Це можна зробити?


Скопіюйте, а потім усічіть.
Jenny D

Він може втратити кілька цінних записів журналу між цими двома запропонованими вами операціями. Я б не рекомендував це.
Кліанкод

Відповіді:


6

Вам слід поглянути на філог у поєднанні з logrotate. Якщо ви передаєте вихідний додаток через це, ви зможете SIGHUPвиконувати процес блокування, не вбиваючи запущену програму.

flog (file logger) - програма, яка зчитує вхід зі STDIN і записує у файл.

Якщо буде отримано SIGHUP, файл буде відновлено, що дозволить обертати журнал [див. Логротат (8) на RH.]

Файл журналу буде відкрито лише тоді, коли flog виявить, що відбулося обертання (тобто, старий файл відійшов або змінено inode). plog надзвичайно малий (менше 500 байт пам'яті).


Чи може nohup використовувати трубу замість nohup.out?
Брайан Мінтон

1
Ви можете скористатися перенаправленням файлів (>) для виводу у файл, відмінний від nohup.out, відповідно до сторінки man:To save output to FILE, use 'nohup COMMAND > FILE'
jas_raj

4

Ви не можете його обертати. Ви можете обрізати його командою >nohup.out, яка видалить увесь вміст у файлі.

Ви можете скопіювати файл спочатку, а потім обрізати його, якщо вам потрібно зберегти вихід. Але є невелике вікно для гонки, де вихід може бути записаний після того, як ви скопіювали файл, але перед тим, як його врізати. Будь-який вихід, написаний під час цього вікна, буде назавжди загублений.


1
Я вважаю, що обрізання не звільнить місця на диску, поки ручка файлу не буде закрита.
symcbean

@symcbean Ваше переконання неправильне. Обрізання файлу звільняє простір негайно.
kasperd

Копія логротета повинна зробити трюк.
користувач9517

@Iain Кроки, які я описую, еквівалентні copytruncateв logrotate. Але nohup.outрідко буває такий тип файлу, який ви могли б налаштувати роботу cron на обертання.
kasperd

2

Ви не можете.

Ви можете від’єднати файл (rm), але дані все-таки мають на диску диски, і вони продовжуватимуться записуватись до тих пір, поки буде відкрита ручка файлу.

Ви можете перейменувати файл, але знову ж таки це не зупиняє його запис (але якщо ви регулярно запускаєте фонові завдання, новіші будуть записувати в той самий файл).

Дійсно, ви повинні явно перенаправити висновок завдання на щось, призначене для цього (наприклад, роталоги апатів ).


логроте копіюватимете кого?
користувач9517

Це повністю залежить від того, додає nohup до nohup.out по черзі чи підтримує він вказівник на розташування nohup.out. Для прикладу дивіться serverfault.com/questions/221337/… .
pepoluan

2

Не впевнений, чи я спізнююсь із цим. Але для інших, хто зараз натрапляє на цей форум, мені не довелося нічого випробовувати за допомогою лома або чогось іншого.

Моя робота починається просто так:

nohup <my process> &

Це запускає мою роботу і починає додавати до nohup.out у цьому каталозі.

Все, що мені потрібно було зробити, це встановити логротат, який зазвичай постачається з дистрибутивом, і налаштувати щось подібне в /etc/logrotate.conf

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

І це працювало !! nohup.out стає усіченим, отримуючи нові додатки до того ж файлу. Процес теж не загинув. І створено новий nohup.out подібний nohup.out-20190528.

Сподіваюсь, це допомагає.


1

У Logrotate є опція copytruncate, яка уріже (порожнє) вказаний файл після того, як він буде скопійований у звичайну схему обертання (та стиснення, якщо встановлено).

   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.

З логротатної сторінки .


1

Ви можете зробити щось подібне:

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

Не потрібно вбивати додаток.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.