簡體   English   中英

沒有crontab怎么每天發一個信號?

[英]How can I send a signal every day without crontab?

語境:

我正在重試系統上開發嵌入式 openwrt,用於 http 請求和證書強制檢查。

我們不信任我們的 web 服務器,並希望每天重試 GET HTTP 文件,直到它被下載。

我們還想在精確的時間下載文件。

在正常時間,節目是:

  • 管理 LED 的 state 和.network state
  • 從消息隊列接收消息以執行 web 請求和.network 管理
  • 它監視 2 個其他進程,一個藍牙和一個可能崩潰的 Zigbee。
  • 到我們生產 go 時,它可能會做其他事情。

有問題的:

我想每天在C編程一個信號來獲取異步事件。 所以我基本上想要沒有 crontabs 的 crontab。

我想使用的信號是 IPC 中使用的信號(我不知道在 linux 上創建異步行為的其他方法): https://www.man7.org/linux/man-pages/man7/signal.7.html

我知道如何使用 crontab,但我更願意在 C 中做所有事情,因為它會讓我的架構對於不使用 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM