睡眠机制如何在Linux中运行

时间:2017-06-10 20:30:51

标签: linux bash timer daemon systemd

我们有一个嵌入式Linux,我们在其中管理和控制许多*子系统。此外,它还具有通信介质,允许我们在没有电缆(S-Band)的情况下与之通信。 目前,我正在处理一些脚本,我们可以在运营期间使用它们。

这是一个计时器原型,我们可以在时钟显示00:00时激活一些脚本。

while [ 1 ]; 
do
    curHour="$(date +%H)"
    curMin="$(date +%M)"
    echo $curHour:$curMin
    if ((10#$curHour=="0")); then 
        if((10#$curMin=="0"));then
            ./archAndComp.sh
        fi
    fi  
    sleep 60
done

我正在调用的脚本具有特定的作业,这些作业正在归档和压缩所需的目录。这是我解释的原型。

dirName="logs"
j=0
if (find $PWD $dirName*); then
    i=0
    while (find $PWD $dirName-$i.tar.xz);
    do
        let i++
    done
    tar -cvf $PWD/$dirName-$i.tar $PWD/var/log/$dirName 
    xz  $PWD/$dirName-$i.tar
else
    tar -cvf $PWD/$dirName-$j.tar $PWD/var/log/$dirName 
    xz  $PWD/$dirName-$j.tar
fi  

总之,在每天结束时,我想归档和压缩特定目录。提供了文件传输/下载脚本。因此,无需讨论该部分。

让我烦恼的是;当timer.sh脚本处于活动状态时,是否会导致进程休眠,不允许任何其他进程完成?或者,某些内部调度程序可以将sleep分配给类似线程的机制,允许其他进程继续其生命...

对于第一种情况,我应该守护定时器脚本。如果我坚持使用systemd或实现我自己的类似时钟的守护进程,那么你的建议是什么?

1 个答案:

答案 0 :(得分:1)

Eric Renouf有一点 - 除非你对嵌入式系统的内存非常紧张,cron是定期运行其他进程的好方法。但是,如果你决定坚持使用bash解决方案,那么就会有一些提示。

自定义while true用于无限循环。隐藏了一些技术细节,导致它可能比while [1]好一些。稍微好一些:你可以节省几个CPU周期。所以,它并不是很烦人。

您已经选择了非常精细的方法来检查运行流程的时间是否到了。它可以更简单:

if [ "$(date +%H%M)" = "0000" ]; then
  ./do-something.sh
fi

无需每60秒检查一次。您可以查看当前时间并睡到午夜:

while true; do
  t=( $(date +"%H %M %S") )   # store current hh:mm time into an array
  if [ "${t[0]}${t[1]}" = "0000" ]; then
    ./do_something.sh      # it could be a time consuming process
    t=( $(date +"%H %M") ) # so we want to know when it ends
  fi
  # sleep till next midnight
  sleep $[ 86400 - 3600 * ${t[0]} - 60 * ${t[1]} - ${t[2]} ] 
done

您可能希望在后台调用脚本:

./my_scheduler.sh &

此外,您可能希望将日志保留在调度程序中调用的任何内容中:

./do_something.sh > /log/something.log 2>&1

至于你原来的问题:来自bash的睡眠是使用sleep(3)系统调用实现的。或多或少,它意味着调度程序(内核子系统决定何时为进程/线程分配CPU时间):除非指定的时间过去或特殊情况发生,否则不要运行我。因此,睡眠过程不会占用CPU资源。