初始化脚本不运行

初始化脚本不运行

我希望创建一个在运行级别 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

  1. 注销我的用户。
  2. CTRL+ ALT+F2即可查看tty2
  3. 登录到我的用户并sudo service lightdm stop禁用 GUI。
  4. 然后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++ALTF1查看时tty1,我注意到顶部有文本“Hello world!”(在登录提示之前)。

唯一的问题是要认识到:

  1. 他们为什么现在工作?
  2. 为什么该脚本在 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 风格的服务。)

进一步阅读

相关内容