我有一个脚本,可以在 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,所以我不确定你的系统是否也是这种情况)atd
(at
守护进程)似乎没有运行,我必须手动启动它并使用以下命令启用它:
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 小时后关闭系统,您应该将第一个设置sleep
为59m
并进行相应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