如何在Unity登录/注销上运行脚本?


8

我有两个脚本-一个用于通过SSHFS挂载一些文件夹的脚本-一个用于卸载的脚本。

我想在启动默认的Ubuntu桌面时(在图形控制台登录后)启动安装脚本,而当我从工具栏右上角的齿轮“注销...”时启动卸载脚本。桌面。

请有人能告诉我如何实现吗?在桌面启动/退出时运行命令最方便/最标准的钩子是什么?


我不认为时机很关键。重要的是,在用户交互式启动应用程序之前,第一个脚本会在大约一秒钟内执行。注销时,重要的是在别人登录控制台之前执行第二个脚本。
2014年

我具有root访问权限。安装软件包没有问题。如果可能的话,我只想使用用户级特权-假设有一种巧妙的方法可以做到这一点。我的脚本不需要root。我正在寻找有关如何最好地在Unity启动/停止上启动脚本的建议...我的大部分Linux / Unix经验都是在非GUI环境中进行的。使用老式的XWindows和普通的窗口管理器,我可以从.xinitrc中完成此操作。现代默认的Unity桌面的最佳方法是什么?
aSteve

我不想让注销操作依赖于已安装/未安装的内容...全部由现有脚本动态处理。我需要的是一种在控制台上执行GUI会话时在登录时执行第一个脚本以及在注销时执行第二个脚本的巧妙方法。我已经找到了“启动应用程序”-但这只能解决问题的前半部分。
2014年

我认为“登录应用程序”不是这两个脚本的正确策略。我有两个脚本...一个为我的GUI会话设置内容;另一个 另一个在GUI会话后清除。两者都应以与GUI会话相同的用户身份运行。两者都不需要任何参数。我需要找到一种适当的方式来启动脚本-在正确的时间就这样。无需对脚本的实际操作做任何假设。这个问题是关于如何挂钩与Unity登录和注销相一致的事件的。
2014年

Answers:


9

考虑到您登录Unity时而不是其他登录时运行作业的要求,Upstart 会话作业似乎很完美。

您可能已经注意到了:GUI登录后运行的init进程处于第二个进程中。这init是一个适当的Upstart初始化,您可以根据它发出的事件来启动和停止会话作业。根本不需要root特权。更好的是(或从角度来看更糟),无头系统尚未完全支持此功能。SSH登录并没有从我刚才进行的快速测试中启动用户初始化。

要创建会话作业,请在中创建一个新.conf文件~/.config/upstart。这是Upstart会话作业($XDG_CONFIG_HOME/upstart)的默认主目录,如果不存在,请创建它。这是一个示例工作:

tee ~/.config/upstart/myjob.conf <<EOF
description "My job"
start on desktop-start
stop on desktop-end

script 
       firefox 'http://upstart.ubuntu.com/cookbook/#session-job'
end script
EOF

您可以手动控制它:

start myjob 
# or
initctl start myjob

service命令用于控制系统作业(/etc/init.d或中的作业/etc/init)。为了控制会话作业,需要使用该initctl命令,该命令用于与Upstart进行交互。

请参阅man upstart-events更多可用的事件。


我没注意到...但是...我同意-新贵会议工作看起来很完美。我可能缺少明显的东西……但是当我执行“ service myjob start”时创建了〜/ .config / upstart / myjob.conf(如上所述),我得到了“ myjob:无法识别的服务”,有什么想法吗?
2014年

解决了它:我需要使用“ start myjob”而不是“ service myjob start”。另一个有用的命令是“ initctl list”
aSteve

@aSteve对此感到抱歉。我更正了
大师

没问题。新贵/会议方法肯定看起来正确。也就是说,我还没有找到使用它执行单独的(短暂的)启动和停止脚本的最佳方法。我可以只使用1个.conf文件,还是需要2个?应该是“服务”还是“任务”?我应该使用开始前/后开始和停止前/后停止吗?我不需要/不需要在开始和停止之间运行的过程...除非我猜想,除非有一种简单的方法可以在工具栏中放置图标...尽管出于我的目的,这可能有点过头了。
aSteve 2014年

1
最后。经过大量的黑客攻击……我发现我需要在“会话端”而不是“桌面端”触发myendtask。这有点违反直觉,但是可以。(终于!)
aSteve

1

解决方案是使用新贵任务。我需要执行两项任务-一项是在为用户初始化桌面时触发的;用户会话过期时的第二个。以下两个脚本在Ubuntu 14.04下对我有用。

在〜/ .config / upstart / desktopOpen.conf中

description "Desktop Open Task"
start on desktop-start
task
script
# Commands to mount sshfs go here as shell-script.
end script

在〜/ .config / upstart / desktopClose.conf中

description "Desktop Close Task"
start on session-end
task
script
# Commands to unmount sshfs go here as shell-script.
end script

令我震惊的是,这些事件将继续满足未来Ubuntu版本中的要求。我认为值得在这里发布我的解决方案-以防其他人使用。


-1

以下是登录后运行脚本的一些建议:

引导后的StackOverflow Linux脚本:Cliff指出将* .sh文件放在/etc/profile.d中。

如果要在启动时运行脚本,以下是一些建议:

引导后的StackOverflow Linux脚本:Cliff注意是使用/etc/rc.local或crontab。


1
这些选项都不是“正确的”。从启动/结束统一会话的意义上讲,我只想在登录/注销时执行脚本。我不想每次都有新登录时都运行我的脚本。可以通过ssh等远程启动新的登录-但我不希望它们执行脚本,因为它们不启动新的Unity会话(在控制台上)。
aSteve
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.