【问题标题】:How can I send a signal every day without crontab?没有crontab,我如何每天发送信号?
【发布时间】:2020-09-01 15:01:59
【问题描述】:

上下文:

我正在重试系统上开发嵌入式 openwrt,用于 http 请求和证书权限检查。

我们不信任我们的网络服务器,并希望每天重试 GET HTTP 文件,直到下载为止。

我们还想在准确的时间下载文件。

在正常时间,节目是:

  • 管理 LED 状态和网络状态
  • 从消息队列接收消息以执行 Web 请求和网络管理
  • 它监控其他 2 个进程,一个蓝牙和一个可能崩溃的 Zigbee。
  • 当我们投入生产时,它可能会做其他事情。

有问题:

我想每天用 C 编写一个信号来获取异步事件。所以我基本上想要没有 crontab 的 crontab。

我要使用的信号是IPC中使用的信号(我不知道在linux上创建异步行为的其他方法):https://www.man7.org/linux/man-pages/man7/signal.7.html

我知道如何使用 crontab,但我更喜欢用 C 语言来做所有事情,因为对于不使用 linux 的同事来说,这会让我的架构更简单。

问题:在 Linux 上用 C 语言获取每日/周期信号的正确方法是什么?

非常感谢,

【问题讨论】:

  • 为什么计时器不能满足您的需求?
  • 从系统请求日期和时间并创建一个计时器以在每天所需的时间触发应该是可行的,但我认为在 Linux 上可能已经有了解决方案。类似 eventHour(hour, signal, handler)。
  • 不,没有内置任何东西。这就是cron 通常的用途,而不是连续运行程序并等待到达时间。
  • @Damezumari 请不要在 cmets 中回答,edit 您的问题并在那里添加所需的信息。您问题中的“信号”一词是否指kill发送的信号?如果是,请添加有关您要发送到哪个进程的信号的详细信息。如果没有,请更详细地说明您每天/定期要做什么?
  • @Bodo 据我正确理解问题,用户不确定信号是否可以用于他的用例。因此,他不能添加任何细节。

标签: c linux timer embedded


【解决方案1】:

我不知道在 Linux 上创建异步行为的其他方法

Linux 本身似乎不支持任何与您想要的类似的东西。

要在某个时间执行某些动作,必须启动某个程序并在后台运行,直到该动作被执行。如果要循环执行该动作,则程序必须永久运行。

使用crontab 的优势在于,即使您的crontab 中有数百个不同的操作,也只有一个程序(cron) 在后台运行。但是,一个程序 (cron) 一直在后台运行。

systemd 也是如此。

如果你不想使用这样的工具,你的程序必须在后台永久运行。

timer_create

如果您需要相当高的精度(例如小于一秒),可以使用此选项。

如果您不需要高精度并且不想要cron 或类似的东西,我会这样做:

seconds_per_day = 60*60*24;
next_time = time(NULL) + seconds_per_day;
while(1)
{
    usleep(5000000);
    if(time(NULL) >= next_time)
    {
        perform_action();
        next_time += seconds_per_day;
    }
}

在示例中,我使用usleep() 等待 5 秒。使用更长的时间(例如 10 秒)将减少在后台运行的程序消耗的 CPU 功率 - 并使触发操作的确切时间点更加不精确。

该示例只是每 24 小时触发一次操作。

但是,您可以使用相同的原理在某个时间(例如晚上 11:30)触发一些动作或在不同时间触发多个动作...

【讨论】:

    猜你喜欢
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-14
    • 2013-03-24
    相关资源
    最近更新 更多