[英]How can I send a signal every day without crontab?
語境:
我正在重試系統上開發嵌入式 openwrt,用於 http 請求和證書強制檢查。
我們不信任我們的 web 服務器,並希望每天重試 GET HTTP 文件,直到它被下載。
我們還想在精確的時間下載文件。
在正常時間,節目是:
有問題的:
我想每天在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(小時,信號,處理程序)。
我沒有 systemd https://linuxconfig.org/how-to-schedule-tasks-with-systemd-timers-in-linux
問: Linux上C獲取日/周期信號的正確方法是什么?
非常感謝,
我不知道在 Linux 上創建異步行為的其他方法
Linux 本身似乎不支持與您想要的類似的任何東西。
要在特定時間執行特定操作,必須啟動某些程序並在后台運行,直到執行該操作。 如果要循環執行操作,則程序必須永久運行。
使用crontab
的好處是只有一個程序 ( cron
) 在后台運行,即使您的crontab
中有數百個不同的操作。 但是,一個程序 ( 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)觸發某些動作或在不同時間觸發多個動作......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.