【问题标题】:Cronjob continuously reduces free disk spaceCronjob 不断减少可用磁盘空间
【发布时间】:2019-06-04 03:49:52
【问题描述】:

我有一个 .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 启动时。知道可能是什么问题吗?

【问题讨论】:

    标签: .net-core cron rc linux-disk-free


    【解决方案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);
    }
    

    【讨论】:

      猜你喜欢
      • 2022-01-09
      • 2019-11-14
      • 2019-07-14
      • 2021-11-17
      • 1970-01-01
      • 2019-06-10
      • 1970-01-01
      • 2019-12-12
      • 2018-07-22
      相关资源
      最近更新 更多