每次我关闭或重启笔记本电脑(Ubuntu 14.04)时,我都想运行一个脚本来检查我是否将最新代码推送到了远程 git 存储库。如果我忘记了,那么它会打开一个终端,要求用户输入提交消息并推送更改。我已经让脚本运行了。
现在我正在寻找一种方法,使该脚本在我关机或重启时但在 GUI 退出之前自动运行。
到目前为止,我的方法是使用 System V Init(是的,我知道它有点过时):
我将带有 LSB 标头的初始化脚本复制到 /etc/init.d:
sudo cp ~/git_checker /etc/init.d/
,更改权限:
sudo chmod a+x /etc/init.d/git_checker
并配置执行场景:
sudo update-rc.d /etc/init.d/git_checker defaults
当我用测试此脚本时sudo service git_checker start
,出现错误:“无法解析参数:无法打开显示:”
通过阅读,我发现,不应该使用 init 脚本来打开终端(像这样:)
su user -c 'x-terminal-emulator -e /home/user/git_check.sh'
,因为不能保证在执行 init 脚本时 X 服务器正在运行。
因此,init 脚本似乎是错误的方法。还有其他方法吗?也许使用 upstart 或 systemd?
如果要在系统启动时运行脚本,我可以简单地将其放在启动应用程序中。是否存在类似的东西,例如关机应用程序?
答案1
我创建了一个小监控脚本不久前,一旦脚本检测到用户试图关闭计算机,它就会调用一个中断函数。针对您的具体情况,需要进行的小修改是取消关机操作,运行脚本,然后调用关机。
#!/bin/bash
main()
{
dbus-monitor --profile "interface='com.canonical.Unity.Session',type=signal,member=RebootRequested" | \
while read -r line;
do
# echo $line
grep -q '.*NameAcquired.*' <<< "$line" && continue # Ignore that first line
if [ -n "$line" ];then
interrupt
fi
done
}
interrupt()
{
# The first command will close the shutdown dialog
qdbus com.canonical.Unity /com/canonical/Unity/Session com.canonical.Unity.Session.CancelAction
# place call to your script bellow this comment
zenity --info --text='Remember to push changes to git repo'
# Uncomment line bellow for shutdown
# qdbus com.canonical.Unity /com/canonical/Unity/Session com.canonical.Unity.Session.Shutdown
}
main
当然,这个脚本必须作为启动应用程序的一部分添加,或者你可以为其手动创建 .desktop 文件
笔记:此脚本仅适用于 GUI,因此如果用户发出命令sudo shutdown -P now
,它将不起作用。您还需要shutdown
使用另一个脚本来监视命令pgrep shutdown
或将另一个功能集成到脚本中。
例如,在上面的脚本中,您需要添加此功能
manual_shutdown_monitor()
{
while true
do
if pgrep shutdown > /dev/null
then
zenity --info --text="GOT MANUAL"
fi
sleep 0.25
done
}
然后main()
像这样调用该函数
manual_shutdown_monitor &