笔记本开盖/重新登录时自动运行指定bash脚本的方案咨询
笔记本开盖/重新登录时自动运行指定bash脚本的方案咨询
我懂你的需求——不想让crontab每分钟轮询检查时间,又想补上笔记本合盖锁屏期间错过的定时任务,同时在开盖唤醒或者解锁登录时自动触发脚本运行。下面给你几个实用的、适配不同场景的方案:
方案一:利用桌面环境的登录/解锁触发机制(以GNOME为例)
大部分主流桌面环境都支持在登录或解锁时自动执行程序,刚好能覆盖你按Win+L锁屏后解锁的场景:
- 打开用户配置下的自启动目录:
~/.config/autostart/ - 创建一个名为
run-myscript-on-unlock.desktop的文件,写入以下内容(记得替换脚本路径):[Desktop Entry] Type=Application Name=Run My Script on Unlock Exec=/full/path/to/your/script.sh X-GNOME-Autostart-enabled=true X-GNOME-Autostart-Delay=0 OnlyShowIn=GNOME; - 保存后,每次你解锁登录(包括锁屏后解锁、开机登录)都会自动执行这个脚本。如果是合盖休眠后开盖,系统唤醒后会进入解锁界面,解锁时也会触发。
方案二:用systemd处理系统唤醒(开盖触发)
如果你的笔记本合盖会触发系统休眠/挂起,那可以用systemd创建一个唤醒触发的服务,直接在开盖唤醒时运行脚本,不需要等解锁:
- 创建一个systemd服务文件,比如
/etc/systemd/system/run-script-on-wake.service,内容如下:[Unit] Description=Run my custom script when system wakes from sleep After=suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target [Service] Type=oneshot ExecStart=/full/path/to/your/script.sh User=your-username # 替换成你的实际用户名,避免用root运行非必要脚本 [Install] WantedBy=suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target - 执行以下命令启用并启动服务:
sudo systemctl daemon-reload sudo systemctl enable run-script-on-wake.service
这个方案会在系统从任何休眠状态唤醒时自动运行脚本,完美对应开盖的场景。
方案三:结合两种场景,覆盖所有情况
如果想同时处理解锁登录和开盖唤醒两种场景,直接把上面两个方案结合起来就行——用systemd服务处理唤醒,用桌面自启动项处理解锁,这样不管哪种情况都不会错过脚本运行。
额外小技巧:避免重复执行
如果两个方案同时用,可能会出现短时间内脚本重复运行的情况,你可以在bash脚本里加个简单的判断逻辑,记录上次运行时间,只有间隔超过一定时长(比如1小时)才执行核心内容:
#!/bin/bash LAST_RUN_LOG="$HOME/.last_script_exec_time" CURRENT_TIMESTAMP=$(date +%s) # 检查上次运行时间,1小时内已运行则退出 if [ -f "$LAST_RUN_LOG" ]; then LAST_RUN=$(cat "$LAST_RUN_LOG") if [ $((CURRENT_TIMESTAMP - LAST_RUN)) -lt 3600 ]; then exit 0 fi fi # 这里写你的脚本核心逻辑 echo "Script executed at $(date)" >> "$HOME/script_execution.log" # 更新上次运行时间记录 echo "$CURRENT_TIMESTAMP" > "$LAST_RUN_LOG"
备注:内容来源于stack exchange,提问作者Sebastian Illi
相关产品推荐
相关产品推荐

