没有crontab怎么每天发一个信号?
How can I send a signal every day without crontab?
上下文:
我正在重试系统上开发嵌入式 openwrt,用于 http 请求和证书强制检查。
我们不信任我们的 Web 服务器,希望每天重试 GET HTTP 文件,直到下载完成。
我们还想在精确的时间下载文件。
在正常时间,节目是:
- 管理 LED 状态和网络状态
- 从消息队列接收消息以执行网络请求和网络管理
- 它监控另外 2 个进程,一个蓝牙和一个可能崩溃的 Zigbee。
- 当我们投入生产时,它可能会做其他事情。
有问题:
我想每天用C语言编写一个信号来获取异步事件。所以我基本上想要没有 crontabs 的 crontab。
我想使用的信号是 IPC 中使用的信号(我不知道在 linux 上创建异步行为的其他方法):https://www.man7.org/linux/man-pages/man7/signal.7.html
我知道如何使用 crontab,但我更喜欢用 C 来做所有事情,因为它会让我的架构对于不使用 linux.
的同事来说更简单
据我所知crontab没有C api.
我在我的代码中使用了计时器,但它们似乎不适合这种用法:https://man7.org/linux/man-pages/man2/timer_create.2.html
从系统请求日期和时间并创建一个计时器以在每天所需的时间触发应该是可行的,但我认为 Linux 上可能已经有一个解决方案。类似于 eventHour(hour, signal, handler).
我没有systemd https://linuxconfig.org/how-to-schedule-tasks-with-systemd-timers-in-linux
问题:在 Linux 上用 C 语言获取 dayly/periodic 信号的正确方法是什么?
非常感谢,
I don't know other way to create asynchronous behaviors on Linux
Linux 本身似乎不支持与您想要的类似的东西。
要在特定时间执行特定操作,必须在后台启动某些程序并 运行 直到执行该操作。如果要循环执行操作,则程序必须永久 运行ning。
使用 crontab
的优点是只有一个程序 (cron
) 在后台运行 运行 即使您的 [=11= 中有数百个不同的操作也是如此].但是,有一个程序 (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:30pm)或在不同时间触发多个动作...
上下文:
我正在重试系统上开发嵌入式 openwrt,用于 http 请求和证书强制检查。
我们不信任我们的 Web 服务器,希望每天重试 GET HTTP 文件,直到下载完成。
我们还想在精确的时间下载文件。
在正常时间,节目是:
- 管理 LED 状态和网络状态
- 从消息队列接收消息以执行网络请求和网络管理
- 它监控另外 2 个进程,一个蓝牙和一个可能崩溃的 Zigbee。
- 当我们投入生产时,它可能会做其他事情。
有问题:
我想每天用C语言编写一个信号来获取异步事件。所以我基本上想要没有 crontabs 的 crontab。
我想使用的信号是 IPC 中使用的信号(我不知道在 linux 上创建异步行为的其他方法):https://www.man7.org/linux/man-pages/man7/signal.7.html
我知道如何使用 crontab,但我更喜欢用 C 来做所有事情,因为它会让我的架构对于不使用 linux.
的同事来说更简单据我所知crontab没有C api.
我在我的代码中使用了计时器,但它们似乎不适合这种用法:https://man7.org/linux/man-pages/man2/timer_create.2.html 从系统请求日期和时间并创建一个计时器以在每天所需的时间触发应该是可行的,但我认为 Linux 上可能已经有一个解决方案。类似于 eventHour(hour, signal, handler).
我没有systemd https://linuxconfig.org/how-to-schedule-tasks-with-systemd-timers-in-linux
问题:在 Linux 上用 C 语言获取 dayly/periodic 信号的正确方法是什么?
非常感谢,
I don't know other way to create asynchronous behaviors on Linux
Linux 本身似乎不支持与您想要的类似的东西。
要在特定时间执行特定操作,必须在后台启动某些程序并 运行 直到执行该操作。如果要循环执行操作,则程序必须永久 运行ning。
使用 crontab
的优点是只有一个程序 (cron
) 在后台运行 运行 即使您的 [=11= 中有数百个不同的操作也是如此].但是,有一个程序 (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:30pm)或在不同时间触发多个动作...