我试图理解初始化进程。
我有一个脚本,可以启动 3 个后台进程(2 个 shell 脚本和一个 java 应用程序)。它在命令行中运行良好。
我想在启动时执行该脚本。
/etc/init.d/skeleton
对我来说毫无意义,因为它似乎在寻找单个进程。而且大多数 init 脚本看起来太复杂了,我有点不知所措。
我真正想做的是:
#!/bin/bash
/opt/myapp/bin/my_start_script
如果这在启动时就发生,我会很高兴。
答案1
使用 Upstart,因为 System V Init 脚本已被弃用,而且它更简单。
只需将此文件my_script.conf
放入/etc/init
# Start when pc starts up
start on runlevel [2345]
# Stop when pc shuts down
stop on runlevel [016]
# Start Script
exec my_start_script
# Stop Script
pre-stop my_stop_script
该pre-stop
脚本包含用于终止您的 3 个进程的代码并且是可选的,当服务停止时,sigterm 将被发送到 my_start_script 进程,但根据您的脚本,它可能已经退出。
sudo service my_script start
您可以通过运行来测试您的新服务sudo service my_script stop
答案2
如果您想使用 GUI,您可以将链接添加到 Ubuntu 中的启动应用程序。 这样做的缺点是它只会在您登录 GUI 时执行(即不适用于其他用户,如果您不登录 Ubuntu 桌面环境,也不会执行)。
使用命令行,您可以使脚本在 Ubuntu 桌面加载之前运行。
为此,请使脚本可执行,将其复制到/etc/init.d
,并创建指向脚本的符号链接(/etc/rc2.d
如果您希望它在默认的多用户运行级别(运行级别 2)中执行)。您应该用 S 重命名它,后面跟着您希望它执行的顺序,与那里的其他链接相对应。
使脚本可执行:
sudo chmod u+x myscript.sh
复制到
/etc/init.d
:sudo cp myscript /etc/init.d
在 rc2.d 中创建一个符号链接:
cd /etc/rc2.d
sudo ln -s /etc/init.d/myscript.sh
根据命名方案重命名:
sudo mv myscript.sh S70myscript.sh
/etc/init.d
有关详细信息,请参阅和中的 README 文件/etc/rc2.d
。