初始化脚本不运行

Dor*_*Dor 1 init.d init 16.04

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

  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行之前,但仍然没有任何反应(没有创建文件)。


UTC 时间 10 月 6 日 18:00 更新:

出于某种原因,现在我可以看到所有的目录中的文件/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!” 在顶部(在登录提示之前)。

唯一的问题是要意识到:

  1. 为什么他们现在工作?
  2. 为什么脚本在 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.conf2

$ 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运行。

任何想法发生了什么?


UTC 时间 10 月 6 日 18:40 更新:

我现在明白了 - Ubuntu 的运行级别与标准不同,请参阅:http :
//upstart.ubuntu.com/cookbook/#runlevels

这意味着运行级别25都是一样的:

图形多用户加网络 (DEFAULT)

Jde*_*eBP 5

我现在明白了 - 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 风格的服务。)

进一步阅读