和这个提示我看到总共有大约 60 个应用程序由启动应用程序启动,而此刻我不得不坐下来等待大约 45 秒,而桌面没有响应......
启动应用程序如何工作?我可以以某种方式进行调整,使这些应用程序更逐步地启动,而不是同时启动吗?
我不想禁用其中任何一个,只是想阻止它们同时加载并冻结桌面
答案1
我第一次看到这个提示,但sleep 20;xscreensaver -nosplash
似乎在 Ubuntu 14.04 上不再起作用。
所以我编写了这个脚本execLater.sh
并将它放在我的 $PATH 中的一个位置,chown
对其进行了编辑root:root
并设置了模式权限rwxr-xr-x
,然后将它放在一个完整的root:root
文件夹结构中/usr/local/bin
。
sleep $1;shift;"$@"
因此它在执行命令之前会处于休眠状态。
现在针对每个启动应用程序。
例如,如果有这样的情况:
xscreensaver -nosplash
更改为以下内容,其中“20”是延迟;我使用了最多“60”,因为我知道自己不太关心某些应用程序;对于我最关心的应用程序,最少使用“5”。
execLater.sh 20 xscreensaver -nosplash
棘手的部分
下面每个都必须有一个独占延迟“1”,因为其他一切都取决于它们
/usr/bin/gnome-keyring-daemon --start --components=secrets
/usr/bin/gnome-keyring-daemon --start --components=pkcs11
/usr/bin/gnome-keyring-daemon --start --components=gpg
/usr/bin/gnome-keyring-daemon --start --components=ssh
/usr/lib/unity-settings-daemon/unity-fallback-mount-helper
/usr/lib/policykit-1-gnome/polkit-gnome-authentication-agent-1
gsettings-data-convert
start-pulseaudio-x11
nautilus -n
我的猜测是,当所有 60 个应用程序同时启动时,上述应用程序需要更长时间才能完成,因此整个桌面将不可用......
如果您记录每个命令的执行时间,您就会明白哪些应用程序必须具有“1”的延迟,因为所有其他应用程序都是“实际上只执行(?)”或“调用?”在这些之后;上面的列表不是固定的,它只是一个提示,只需注销并登录(无需重新启动即可完成此列表),这样您就可以进行测试,直到对结果满意为止 - 现在我的桌面仅在 5 秒后即可使用 :)
答案2
@Aquarius Power 的建议很有帮助,但有更简单的方法可以在启动脚本中控制后台运行。首先假设你有某种启动脚本 - 如果没有,创建一个启动脚本、使其可执行,然后将其添加到启动项中可能会很有用。然后,您可以从启动项列表中删除某些内容,并在脚本中延迟启动它们 - 但您必须确保它们处理任何顺序依赖关系。
您可以使用 Aquarius 的“execLater”脚本,但在后台运行允许一定程度排序的程序的更简单方法是使用 shell 在后台启动完整 shell 行的功能。
例如,在 shell 脚本中如下:
sleep 20 ; run_something
run_something_else
将导致 shell 脚本在该行上阻塞 20 秒,然后再运行其后的任何内容,例如“run_something_else”
这不起作用,因为它只将“sleep”命令放在后台,然后立即运行“run_something”:
睡眠 20 & ; run_something
解决方案?生成一个新的 shell 并放入那在背景中:
( sleep 20 ; run_something ) &
这会将“sleep 20”和“run_something”结合起来,并将它们都置于后台。
这可以组合成更复杂的依赖关系。例如,我有一个启动音乐守护进程 (mpd) 的进程,我不想在音乐播放器启动之前启动我的两个客户端 (sonata 和 cantata) - 我运行 wmctrl 使 cantata 粘在所有桌面上。我不想让其中任何一个阻止我的其余启动脚本,所以我有:
( sudo /root/startMPD ; sleep 3 ; sonata & cantata & sleep 5 ; wmctrl -r cantata -b add,sticky ) &
尽管我实际上对所有内容都使用了完整路径。请注意,奏鸣曲和康塔塔在后台启动,并且然后sleep 5 保存 wmctrl 以使 cantata 有机会启动。有助于理解在 shell 中,这两行是相同的:
cantata & ; sleep 5
cantata & sleep 5
还值得一提的是,你可以使用“&&”和“||”使将来的命令依赖于先前的命令是否成功(请注意“&&”和“&”之间的区别。例如,如果你在许多系统上运行 shell 脚本,并且只有一些系统安装了 cantata,你可以执行以下操作:
cantanta && ( sleep 5 ; wmctrl ... )
注意我们再次需要括号,否则只有 'sleep 5' 是条件性的,而 wmctrl 不是。您可以使用简单示例在 shell 中自己测试这一点,例如:
ls /does_not_exist && ( echo a ; echo b )
如果它变得太复杂,那么您可能需要考虑切换到更复杂的脚本语言,如 perl/ruby/python/etc..