Cronjob不断减少可用磁盘空间

时间:2019-06-03 11:47:10

标签: .net-core cron rc df

我有一个.NET Core 3.0控制台应用程序,在Ubuntu 18.04服务器上运行。我的主文件夹中有一个简单的启动脚本,名为my-app.sh

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

我想在重启后启动文件,所以我使用crontab -e为启动脚本创建了一个cronjob:

@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 个答案:

答案 0 :(得分:1)

  

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);
}