如何使带有计时器的脚本运行以关闭我的机器?

如何使带有计时器的脚本运行以关闭我的机器?

我有一个脚本,可以在 2 分钟后关闭我的计算机,并且在关闭前 1 分钟它会发送一条通知,内容是“1分钟后将关机”。该脚本将通过启动器点击后执行,并且启动器将出现在其他应用程序中。

.sh因此我创建了一个带有扩展名和启动器图标的脚本。

然后我.desktop./local/share/applications/目录中创建了一个带有扩展的启动器,并将其放在那里shutdown_script.desktop

它出现在其他应用程序中并发送通知,但 PC 没有关闭。我检查了脚本的目录地址,一切正常。我也问过 ChatGPT,但没有帮助。

脚本如下:

#!/bin/bash

# Set the time for shutdown (in 1 hour)
shutdown_time=$(date -d '+2 minutes' +%H:%M)

# Set the time for notification (1 minute before shutdown)
notification_time=$(date -d '+1 minutes' +%H:%M)

# Display a notification 1 minute before shutdown
notify-send "Shutdown Notification" "Your computer will shut down in 1 minute at $shutdown_time" -t 60000

# Schedule the shutdown
echo "shutdown -h now" | at $shutdown_time

echo "Shutdown scheduled at $shutdown_time. Notification will be displayed at $notification_time."

文件如下.desktop

[Desktop Entry]
Name=Shutdown timer Script
Exec="/home/engineer/Programming/Projects/Ubuntu - Automatic shutdown script/shutdown_script.sh"
Terminal=false
Type=Application
Icon="/home/engineer/Programming/Projects/Ubuntu - Automatic shutdown script/icon.png"

我应该怎么做才能让它发挥作用?

答案1

我测试了您的脚本,它可以关闭我的系统。但是,我最初遇到了一个错误:

Can't open /run/atd.pid to signal atd. No atd running?

因此,在我的系统上(Fedora 39,不是 Ubuntu,所以我不确定你的系统是否也是这种情况)atdat守护进程)似乎没有运行,我必须手动启动它并使用以下命令启用它:

systemctl start atd
systemctl enable atd

此后,脚本正常运行并成功关闭我的电脑。

我注意到的另一件事是,由于您编写脚本的方式,通知会立即显示,而不是在关闭系统前 1 分钟显示。因此需要对您的脚本进行一些修改。如果我是您,我根本不会使用at这个任务,我会继续使用sleep反而。

因此脚本看起来是这样的:

#!/bin/bash

# Set the time for shutdown (in 1 hour)
shutdown_time=$(date -d '+2 minutes' +%H:%M:%S)

# Set the time for notification (1 minute before shutdown)
notification_time=$(date -d '+1 minutes' +%H:%M:%S)

echo "Shutdown scheduled at $shutdown_time. Notification will be displayed at $notification_time."

# wait for the specified time (here 1 minute) - see `man sleep` for details
sleep 1m

# Display a notification 1 minute before shutdown
notify-send "Shutdown Notification" "Your computer will shut down in 1 minute at $shutdown_time" -t 60000

sleep 1m

echo "shutdown -h now"

我还添加了:%S命令,date以便您可以查看通知是否在正确的时间显示。如果是(应该如此),您可以将其删除。

我还将 放入shutdown -h now其中echo,因此您可以先测试它是否在正确的时间显示(应该如此)。如果有效,请删除echo以在脚本运行时真正关闭系统。

还请注意,如果您使用 GNOME 作为桌面环境,-t 60000则不会产生任何影响notify-send。从man notify-send

    -t, --expire-time=TIME
           The duration, in milliseconds, for the notification to appear on screen.

    (Ubuntu's Notify OSD and GNOME Shell both ignore this parameter.)

最后,由于(从脚本中的注释来看)您创建此脚本是为了在 1 小时后关闭系统,因此对于脚本的最终形式,您应该考虑sleep显示通知后的 1 分钟。因此,对于在 1 小时后关闭系统,您应该将第一个设置sleep59m并进行相应shutdown_time调整notification_time

有了这些,你的最终脚本应该是这样的:

#!/bin/bash

# Set the time for shutdown (in 1 hour)
shutdown_time=$(date -d '+60 minutes' +%H:%M:%S)

# Set the time for notification (1 minute before shutdown)
notification_time=$(date -d '+59 minutes' +%H:%M:%S)

echo "Shutdown scheduled at $shutdown_time. Notification will be displayed at $notification_time."

# wait for the specified time (here 59 minutes) - see `man sleep` for details
sleep 59m

# Display a notification 1 minute before shutdown
notify-send "Shutdown Notification" "Your computer will shut down in 1 minute at $shutdown_time" -t 60000

sleep 1m

shutdown -h now

相关内容