Linux 中的睡眠机制如何工作
How sleep mechanism works in Linux
我们有一个嵌入式 Linux,我们在其中管理和控制许多*子系统。此外,它还有一种通信介质,可以让我们无需电缆(S 波段)即可与它通信。
目前,我正在处理一些脚本,我们可以在操作期间使用它们。
这是一个计时器原型,我们可以在时钟显示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
总而言之,每天结束时我都想归档和压缩一个特定的目录。提供文件 transfer/download 脚本。因此,无需讨论该部分。
让我烦恼的是;当 timer.sh 脚本处于活动状态时,它是否会导致不允许任何其他进程完成的进程睡眠?或者,某些内部调度程序可能会将 sleep
分配给类似线程的机制,该机制允许其他进程继续其生命...
对于第一种情况,我应该守护计时器脚本。您的建议是什么,我应该坚持使用 systemd 还是实施我自己的类似时钟的守护进程?
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) 系统调用实现的。或多或少,这意味着调度程序(决定何时为 process/thread 分配 CPU 时间的内核子系统):不要 运行 我,除非指定的时间过去或发生特殊情况.因此,休眠进程不会吃掉 CPU 资源。
我们有一个嵌入式 Linux,我们在其中管理和控制许多*子系统。此外,它还有一种通信介质,可以让我们无需电缆(S 波段)即可与它通信。 目前,我正在处理一些脚本,我们可以在操作期间使用它们。
这是一个计时器原型,我们可以在时钟显示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
总而言之,每天结束时我都想归档和压缩一个特定的目录。提供文件 transfer/download 脚本。因此,无需讨论该部分。
让我烦恼的是;当 timer.sh 脚本处于活动状态时,它是否会导致不允许任何其他进程完成的进程睡眠?或者,某些内部调度程序可能会将 sleep
分配给类似线程的机制,该机制允许其他进程继续其生命...
对于第一种情况,我应该守护计时器脚本。您的建议是什么,我应该坚持使用 systemd 还是实施我自己的类似时钟的守护进程?
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) 系统调用实现的。或多或少,这意味着调度程序(决定何时为 process/thread 分配 CPU 时间的内核子系统):不要 运行 我,除非指定的时间过去或发生特殊情况.因此,休眠进程不会吃掉 CPU 资源。