Cronjob постоянно уменьшает свободное место на диске - PullRequest
2 голосов
/ 03 июня 2019

У меня есть консольное приложение .NET Core 3.0, работающее на сервере Ubuntu 18.04.В моей домашней папке есть простой скрипт запуска, который называется my-app.sh:

cd /home/service/my-app
./My-App

Я хотел запустить файл после перезагрузки, поэтому я создал cronjob для скрипта запуска, используя crontab -e:

@reboot /home/service/my-app.sh

После перезагрузки MyApp прекрасно работает.Но при повторном вызове df я заметил, что свободное место на диске / непрерывно уменьшается!Я пытался выяснить, какой это файл, но ncdu не показывал никакой разницы во времени.Я не пишу файл в MyApp, то есть общий размер /home/service не увеличивается * .Примерно через 10 минут все свободное пространство исчезло, и система закрыла MyApp.

Когда я отменяю MyApp после перезагрузки, я вижу, что «утечка памяти» немедленно прекращается.Но: Когда я перезапускаю MyApp вручную, утечка памяти больше не возникает.

Теперь я попытался удалить cronjob и вместо этого добавил файл запуска в файл /etc/local.rc:

# Start MyApp
su service -c 'sh /home/service/my-app.sh' &

Опять же, все началось отлично после перезагрузки, а также нет утечки памяти больше.

Я понятия не имею, в чем может быть проблема.Нет проблем при запуске вручную или с /etc/local.rc, но только при запуске cronjob.Есть идеи, в чем может быть проблема?

1 Ответ

1 голос
/ 03 июня 2019

tl; dr Избегайте взаимодействия с пользователем в консольном приложении (например, ReadLine (), ожидающего определенного ввода).

Подробности: я выяснил, что произошло,Вот последняя часть кода C # моего консольного приложения:

// App can be quit by keyboard input "exit"
while (true) {
    Console.WriteLine("Enter 'exit' to close MyApp.");
    if (Console.ReadLine() == "exit")
        break;
}

Используя этот код, я хотел, чтобы программа работала до тех пор, пока пользователь не введет exit или пока эта «служба» не будет уничтожена.К сожалению, что происходит, так это то, что программа, запущенная Cron или /etc/rc.local, пропускает ReadLine() и запускает бесконечный цикл, запутывая память (и, возможно, заменяя жесткий диск) с бесконечным числом Enter 'exit' to close MyApp.линий.В то время как /etc/rc.local, кажется, постоянно освобождает память, cronjob требует все больше и больше памяти.Не знаю почему, просто наблюдение!

Решение простое.Я удалил взаимодействие и добавил следующий безвредный бесконечный цикл, ожидающий завершения процесса:

// App can only be stopped by killing the process
Console.WriteLine("Started in service mode. To close MyApp, kill the process.");
while (true) {
    Thread.Sleep(1000);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...