我希望创建一个在运行级别 3 启动时只运行一次的脚本。
因此,现在我进行测试以查看执行是否真的有效。
我尝试创建一个/etc/init.d/myscript
包含以下内容的文件:
#!/bin/bash
OUT="/dev/tty1"
echo -e "Hello world!" > $OUT
ps auxf > /path_to_some_folder/_script_ps_auxf.txt
runlevel > /path_to_some_folder/_runlevel.txt
id -u > /path_to_some_folder/id.txt
pwd > /path_to_some_folder/pwd.txt
该文件已为所有用户启用了执行位 (ugo)。我还创建了一个指向的
符号链接。然后我:/etc/init.d/myscript
/etc/rc3.d/S99myscript
- 注销我的用户。
- 按
CTRL
+ALT
+F2
即可查看tty2
。 - 登录到我的用户并
sudo service lightdm stop
禁用 GUI。 - 然后
sudo init 3
为了处于运行级别 3。
但在 之后的文件/path_to_some_folder/
不存在init 3
。为什么?
我还尝试了上述几种其他变体 - 包括使用update-rc.d
。
此外,我尝试进行编辑/etc/rc.local
,以便将代码/etc/init.d/myscript
嵌入到行/etc/rc.local
之前exit 0
,但仍然没有任何反应(没有创建文件)。
更新时间:10 月 6 日 18:00 (UTC):
由于某种原因,现在我可以看到目录中的所有文件/path_to_some_folder/
:(
我给所有文件添加了下划线,_
以便更好地将它们与其他文件区分开来)
$ ls /path_to_some_folder/_*
/path_to_some_folder/_id.txt /path_to_some_folder/_pwd.txt /path_to_some_folder/_runlevel.txt /path_to_some_folder/_script_ps_auxf.txt
通过检查它们的时间,它们都是在系统开机时创建的。
通过检查文件/path_to_some_folder/_script_ps_auxf.txt
,我注意到 init 进程已经启动:
/bin/bash /etc/init.d/myscript start
因此我明白初始化脚本可以正常工作。事实上,当我按CTRL
++ALT
键F1
查看时tty1
,我注意到顶部有文本“Hello world!”(在登录提示之前)。
唯一的问题是要认识到:
- 他们为什么现在工作?
为什么该脚本在 Ubuntu 16.04 的默认运行级别上执行?
它们应该只在运行级别 3 执行,请参阅:$ ls -1 /etc/rc*.d/*myscript* /etc/rc3.d/S99myscript
我自己回答问题 1:
我怀疑需要重新启动才能使初始化脚本正常工作。
关于问题2:
该文件/etc/inittab
不存在,因此无法确定运行级别:
$ ls /etc/inittab
ls: cannot access '/etc/inittab': No such file or directory
根据/etc/init/rc-sysinit.conf
,默认运行级别是2
:
$ grep -m 1 DEFAULT_RUNLEVEL= /etc/init/rc-sysinit.conf
env DEFAULT_RUNLEVEL=2
根据文件,没有内核命令行参数/etc/default/grub
:
$ less /etc/default/grub | grep GRUB_CMDLINE_LINUX=
GRUB_CMDLINE_LINUX=""
当我打开电脑并登录到我的用户时,我注意到我的运行级别是5
:
$ runlevel
N 5
我的脚本应该在运行级别 3 运行仅有的。
知道发生什么事了吗?
更新时间:10 月 6 日,18:40(UTC):
我现在明白了 - Ubuntu 的运行级别与标准不同,请参阅:
http://upstart.ubuntu.com/cookbook/#runlevels
这意味着运行级别2
都是5
相同的:
图形化多用户加网络(默认)
答案1
我现在明白了 - Ubuntu 的运行级别与标准不同,请参阅:http://upstart.ubuntu.com/cookbook/#runlevels
不,事实上你不明白。
你正在使用的操作系统的思维模型在 Ubuntu 上已经被取代了两次。Upstart 是几年前推出的;而你现在使用的版本(16.04)甚至取代了那。
您使用的是 Ubuntu 16.04,一个 systemd 操作系统。根据 systemd 文档,运行级别已“过时”。您可以忘记它们。新贵食谱并且 upstart 的手册页init
不适用(除非您明确切换回 upstart)。
你不需要乱搞/etc/rc.local
。这是来自rc
系统的先于rc
你现在错误地认为你正在使用的范·斯莫伦堡系统。这是一种已经被取代的机制三时代。 /etc/inittab
也已成为过去。Ubuntu 已经有init
十年没有范·斯莫伦伯格了。
您使用的是 Ubuntu 16.04。不要从版本 6 UNIXrc
或 van Smoorenburg开始rc
;小心不要从 upstart 作业文件开始;忘记 van Smoorenburg init
;忘记运行级别。创建一个 systemd 服务单元,并了解目标。
(或者安装 daemontools、daemontools-encore、freedt、runit、nosh、perp 或 s6,并了解 daemontools 风格的服务。)
进一步阅读
- 乔纳森·德·博因·波拉德(2015年)。
/etc/inittab
已成为过去。. 常见问题答案。 - https://unix.stackexchange.com/a/196014/5132
- https://unix.stackexchange.com/a/204075/5132
- https://unix.stackexchange.com/a/233581/5132
- https://unix.stackexchange.com/a/247543/5132
- https://askubuntu.com/a/618138/43344
- https://unix.stackexchange.com/a/211927/5132
- https://unix.stackexchange.com/a/200281/5132