让我们从头开始:我有一个 Pi,当请求到达时它会唤醒我的服务器tcpdump
,并且它工作得很好!
我的问题是,当没有传入数据(比如说 30 分钟)时,我希望我的服务器进入休眠状态。服务器仅供我使用,无论是在我的 LAN 内部还是外部。
我认为我需要使用tcpdump
shell 脚本来监视端口或 IP,如果没有传入,它将对其做出反应。我有一个想法,因为我在网上搜索了 2 天,尝试了很多方法,但都没有成功。
我怎样才能做到这一点?
答案1
我假设“没有传入数据”的意思是:tcpdump
没有打印任何行。因此我们必须启动一个 30 分钟的计时器,并在tcpdump
打印一行时重置它。
启动它相当简单:
sleep 30m && poweroff
我们如何重置它?很简单:我们将sleep
其关闭并重新启动。
我们如何检测新行tcpdump
?一个好的旧while read -r
循环。
把所有内容放在一起:
#!/bin/bash
set -e
shutdown-timer() {
# Waits 30 minutes and shuts down the computer.
sleep 30m && poweroff
}
reset-timer() {
# Kills 'shutdown-timer' (if it's running) and
# restarts it, saving its PID in 'timerpid'.
if [[ -n "$timerpid" ]]
then
kill "$timerpid" || true
fi
shutdown-timer &
timerpid="$!"
}
# Start the timer for the first time.
reset-timer
tcpdump | while read -r line
do
# A new packet was sent or received.
reset-timer
done
请注意,偶尔可能会有干扰数据包。例如,您可能已将 APT 配置为每 5 分钟检查一次更新。这将防止计算机关闭,因为计时器将每 5 分钟重置一次。
tcpdump
如果需要,您可以使用或任何工具过滤输出grep
,如下所示:
tcpdump | grep -v archive.ubuntu.com | while read -r line