我希望创建一个仅在运行级别 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
Run Code Online (Sandbox Code Playgroud)
该文件为所有用户启用了执行位(ugo)。
我还创建了一个指向/etc/init.d/myscriptat的符号链接/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行之前,但仍然没有任何反应(没有创建文件)。
出于某种原因,现在我可以看到所有的目录中的文件/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
Run Code Online (Sandbox Code Playgroud)
通过检查它们的时间,它们都是在系统通电时创建的。
通过检查文件/path_to_some_folder/_script_ps_auxf.txt,我注意到 init 进程已启动:
/bin/bash /etc/init.d/myscript start
Run Code Online (Sandbox Code Playgroud)
因此,我了解 init 脚本有效。确实,当我按CTRL+ ALT+F1以查看时tty1,我注意到文本“Hello world!” 在顶部(在登录提示之前)。
唯一的问题是要意识到:
为什么脚本在 Ubuntu 16.04 的默认运行级别上执行?
它们应该只在运行级别 3 执行,请参阅:
$ ls -1 /etc/rc*.d/*myscript*
/etc/rc3.d/S99myscript
Run Code Online (Sandbox Code Playgroud)我自己回答问题 #1:
我怀疑需要重新启动才能使 init 脚本工作。
关于问题#2:
该文件/etc/inittab不存在,因此无法确定运行级别:
$ ls /etc/inittab
ls: cannot access '/etc/inittab': No such file or directory
Run Code Online (Sandbox Code Playgroud)
根据 ,默认运行级别/etc/init/rc-sysinit.conf是2:
$ grep -m 1 DEFAULT_RUNLEVEL= /etc/init/rc-sysinit.conf
env DEFAULT_RUNLEVEL=2
Run Code Online (Sandbox Code Playgroud)
根据文件,没有内核命令行参数/etc/default/grub:
$ less /etc/default/grub | grep GRUB_CMDLINE_LINUX=
GRUB_CMDLINE_LINUX=""
Run Code Online (Sandbox Code Playgroud)
当我打开我的电脑并登录到我的用户时,我注意到我的运行级别是5:
$ runlevel
N 5
Run Code Online (Sandbox Code Playgroud)
我的脚本应该只在运行级别 3下运行。
任何想法发生了什么?
我现在明白了 - Ubuntu 的运行级别与标准不同,请参阅:http :
//upstart.ubuntu.com/cookbook/#runlevels
这意味着运行级别2来5都是一样的:
图形多用户加网络 (DEFAULT)
我现在明白了 - Ubuntu 的运行级别与标准不同,请参阅:http : //upstart.ubuntu.com/cookbook/#runlevels
不,其实你不明白。
您正在使用操作系统的心智模型,该模型已在 Ubuntu 上两次被取代。几年前就推出了新贵;并且您现在使用的版本 (16.04) 甚至已经取代了.
您正在使用 Ubuntu 16.04,这是一个 systemd 操作系统。根据 systemd doco,运行级别已“过时”。你可以忘记他们。该新贵食谱和暴发户的手册页init不适用(除非您已明确地切换回暴发户)。
你不需要弄乱/etc/rc.local. 来自的rc那个系统之前面包车Smoorenburgrc系统,您使用的是现在错误地思考。这是已被取代的机制3倍。 /etc/inittab也已成为过去。Ubuntu 已经有init十年没有 van Smoorenburg了。
您使用的是 Ubuntu 16.04。不要从第 6 版 UNIXrc或 van Smoorenburg 开始rc;小心从新贵的工作文件开始;忘记van Smoorenburg init;忘记运行级别。创建一个 systemd 服务单元,并了解目标。
(或安装 daemontools、daemontools-encore、freedt、runit、nosh、perp 或 s6,并了解 daemontools 风格的服务。)
/etc/inittab已成为过去。. 经常给出答案。| 归档时间: |
|
| 查看次数: |
9305 次 |
| 最近记录: |