这是因为我想在每次系统启动时运行一个脚本。
我注意到,有很多地方,例如、、、,init.d
以及大量其他地方,在系统每次启动时都会运行。这很容易理解。但它确实显示了系统启动的模糊图景。rc.local
bash_profile
~/config/autostart
~/local/share/applications
有人能告诉我如何简要快速地理解
- 启动 Ubuntu 系统涉及的各个阶段以及
- (忽略那些不太有趣的垃圾)一般来说,用户对于他的定制真正感兴趣的是什么?
请考虑一下,我已经在谷歌上找到了一些糟糕的资源,其中包含难以理解的细节。如果您能用外行人能理解的语言解释一下,或者至少给我指出一个不是外行人无法阅读的厚厚参考手册的地方,我将不胜感激。
我要对那些吹毛求疵的人说,这些答案毫无用处:
虽然它们可能有一些相似之处,但显然它们都没有为初学者提供任何有用的东西。例如,最后一个只能获得一个图表生成解决方案。
答案1
GRUB 加载内核,内核启动 init 进程(通常是/sbin/init
)。接下来发生的事情通常很有趣。在 Ubuntu 历史的不同阶段,有三个 init 系统:
一般来说,Init 系统除了执行其他职责外,还启动需要运行的各种服务。初始化系统做什么?
/etc/init.d
是旧 sysv init 系统感兴趣的 shell 脚本驻留的地方。如果可以,请避免使用它。它存在仅有的出于向后兼容的原因。
/etc/rc.local
是 sysv init 时代的脚本,由于向后兼容,它仍然可以使用。它适合在系统启动时运行短暂的命令以 root 身份。它在启动期间执行一次。对于长期任务,请改用 Upstart ( /etc/init
) 或 systemd ( /etc/systemd/system
) 服务。Upstart 和 systemd 都允许有条件地启动程序,但它们执行的方式不同。
登录 GUI 后,大多数桌面环境都会启动 中列出的应用程序~/.config/autostart
。它非常适合存放登录 GUI 后应运行的命令,例如启动邮件客户端。每次登录时都会执行这些命令,因此每次注销并重新登录时,它们都会被执行(与 不同/etc/rc.local
)。
~/.config/upstart
类似于~/.config/autostart
,但它由登录 GUI 时启动的每会话 Upstart 进程处理。它比 更灵活~/.config/autostart
,后者只是在登录时执行命令。这在 Ubuntu 16.10 之前很有用,其中每会话进程现在是 systemd(从 15.04 到 16.04,主 init 是 systemd,但每会话 init 是 Upstart)。例如,请参阅我的回答:如何在 Unity 登录/注销时运行脚本?
现在你可能可以更好地理解如何在启动时运行脚本?
~/.bash_profile
、~/.profile
、~/.bashrc
等不适合在启动时启动命令。这些通常由命令行 shell 读取,因此当您启动终端或登录 TTY 时。因此,.bashrc
适合每次打开终端时运行命令,以及.profile
当您从 TTY 登录时运行命令。(请参阅这个答案)这些文件也主要用于设置环境变量,但环境变量的规范位置是/etc/environment
系统范围的变量和~/.pam_environment
用户特定的变量。请参阅这个答案。
~/.local/share/applications
与本次讨论无关。