.net-core - Cronjob 不断减少可用磁盘空间
问题描述
我有一个 .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 启动时。知道可能是什么问题吗?
解决方案
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);
}
推荐阅读
- javascript - node-fetch 不适用于 AWS lambda 函数(“找不到 node-fetch”)
- oracle - 我可以使用一个表中的数据创建更新触发器来更新另一个表吗?
- r - R在data.frame的所有行上应用距离函数
- reactjs - 使用 Firebase 身份验证时删除登录组件的 flash (React)
- python - 如何在 Python 中分割图像并保存分割的新图像
- linux - 如何使用 unix 命令从 csv 文件中拆分特定列的值
- python-3.x - Zeep SOAP 复杂标头
- java - “Hello World”应用程序中的错误“消息:尾随部分不允许内容”
- javascript - 我的 JavaScript 函数不起作用 - 尝试比较两个函数并在第二个函数中返回一个语句
- excel - Excel/GSheets 为动态列表中的重复值添加唯一标志