系统
Ubuntu Raring Ringtail (13.04) 全新安装。
目的
主要的:在用户注销时使用脚本更改 gsetting(桌面壁纸)。
我做了什么:(仔细阅读)
我尝试停止名为variety的应用程序(这个)登出时我已经将我的解决方法放在里面了。Variety 是一个自动启动应用程序,所以每次我登录时它都会启动。Variety 有一个函数on_quit()
,force_quit_thread()
当应用程序进程停止时会调用它。因此,我在里面添加了我的 python 脚本行,执行我的真实脚本(normalize
)。当我尝试正常退出variety时,它会执行我想要的操作!我以为,当系统将我注销时,我启动的任何进程也应该停止。但后来,我意识到,事实并非如此。所以,我不能用这种方式。
这让我想到在注销时使用另一种方式手动终止各种进程。我试过了~/.bash_logout
(我对此表示怀疑,因为我知道自动启动不会在 bash 上运行);~/etc/gdm/PostSession/Default
(但是,我没有使用 gdm);~/etc/lightdm/lightdm.conf
(这个也不起作用!为什么?);pam_script / pam-script(我不知道如何使用它。真的很不一样。)
发生了
但是,当我尝试注销我的帐户时,问题就出现了。它既不执行 on_quit() 也不执行 force_quit_thread()。我从~/nohup.out
最后一行捕获的日志如下:
.... bla-bla ... [only see last line]
IOError: [Errno socket error] [Errno 2] No such file or directory
(variety:15627): Gdk-WARNING **: variety: Fatal IO error 11 (Resource temporarily unavailable) on X server :0.
他们失去了可用资源,对吗?未退出正常情况下,这意味着 gsetting 不会改变。
细节
里面添加了脚本
quit functions
它开着
/opt/extras.ubuntu.com/variety/variety/VarietyWindow.py
:bashCommand = "/home/abdillah/Toolbox/command/normalize" os.system(bashCommand)
normalize 中的脚本
目的:品种退出时更改壁纸。
echo $(cat "${HOME}"/.self-log)"| normalize" > "${HOME}"/.self-log #append log wallpaper=$(cat /home/abdillah/.wallpaper) filename="file://"$wallpaper configname=${filename/'#'/"%23"} gsettings set org.gnome.desktop.background picture-uri $configname #the most important
LightDM 配置文件
让我困惑的是文档,没有提到声明
session-cleanup-script
。它已被弃用?[SeatDefaults] user-session=ubuntu greeter-session=unity-greeter autologin-user= session-cleanup-script=/home/abdillah/Toolbox/command/logoff
注销文件包含:
.self-log 文件仍为空 => 失败
#!/bin/bash echo $(cat "${HOME}"/.self-log)" |fail? (OnScript)" > "${HOME}"/.self-log #append log killall variety /opt/extras.ubuntu.com/variety/bin/variety -q echo $(cat "${HOME}"/.self-log)" |Success? (OnScript)" > "${HOME}"/.self-log #log exit 0
问题
当任何人认为上述条件非常具体时,只需回答以下问题。
- 如何在注销时直接执行脚本(中美贸易战上述方法。如果没有,请提出任何建议),或者
- 当我退出时,如何正确停止多样性?(因此调用 on_quit())
可能的解决方案
- 使用 [StartUpApplication] 启动各种程序,
in bash
并使用 ~/.bash_logout 脚本停止。但是,如何停止呢?
好吧,很长。但是,我尽量说得清楚。因为我读过很多与此相关的问题。
答案1
解决方案并不简单。它需要在 X 登录时启动脚本并等待 X 会话结束。幸运的是,我们有 inotify 和 gnome-session 的 pid。
在脚本执行时,各种进程应该已经被正确终止。
- 安装
inotify-tools
包。 创建或修改 ~/.xprofile 脚本并在其中添加以下行
sh .xlogout &
创建 ~/.xlogout 并包含以下内容
FILE=/tmp/.ICE-unix/$PPID # pid of parent = gnome-session sleep 10s # wait for $FILE creation inotifywait -qe delete_self $FILE # wait for $FILE deletion = logout # your code goes here # = on_quit # gsettings reset org.gnome.desktop.background picture-uri