【问题标题】:How sleep mechanism works in Linux睡眠机制在 Linux 中的工作原理
【发布时间】:2017-11-12 15:37:35
【问题描述】:

我们有一个嵌入式 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 还是实现我自己的类似时钟的守护进程?

【问题讨论】:

  • 睡眠通常不是 CPU 密集型活动,除非您有一些奇怪的设置,否则调度程序可能会让其他进程离开。也就是说,为什么不每天使用cron 运行它呢?经常运行的东西正是它的目的

标签: linux bash timer daemon systemd


【解决方案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 资源。

【讨论】:

  • 感谢您的详细回复。
猜你喜欢
  • 1970-01-01
  • 2011-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多