在一个Amazon S3 Linux实例中,我有两个名为start_my_app和stop_my_app的脚本,它们永远地启动和停止(反过来运行我的Node.js应用程序)。我使用这些脚本手动启动和停止我的Node.js应用程序。到目前为止一切顺利。

我的问题是:我还想设置它,以便在系统启动时运行start_my_app。我知道我需要在init中添加一个文件。d和我知道如何符号链接到rc内的适当目录。d,但是我不知道我放在init。d中的文件里到底需要什么。我认为它应该只有一行,比如start_my_app,但这对我来说并不管用。


当前回答

另一种选择是在crontab中使用@reboot命令。

不是每个版本的cron都支持这一点,但如果您的实例基于Amazon Linux AMI,那么它就可以工作。

其他回答

一个简单的方法是在/etc/rc.中添加一行的地方:

/PATH/TO/MY_APP &

或者如果你想以特殊用户的身份运行命令:

su - USER_FOOBAR -c /PATH/TO/MY_APP &

(后面的&号作为进程的背景,并允许rc。本地继续执行)

如果你想要一个完整的init脚本,debian发行版有一个模板文件,所以:

cp /etc/init.d/skeleton /etc/init.d/your_app

稍微调整一下。

对某些人来说,这是可行的:

您可以简单地添加以下命令到系统→首选项→启动应用程序:

bash /full/path/to/your/script.sh

我参考了这个博客,总是听起来不错的选择

https://blog.xyzio.com/2016/06/14/setting-up-a-golang-website-to-autorun-on-ubuntu-using-systemd/

vim /lib/systemd/system/gosite.service

Description=A simple go website
ConditionPathExists=/home/user/bin/gosite

[Service]
Restart=always
RestartSec=3
ExecStart=/home/user/bin/gosite

[Install]
WantedBy=multi-user.target

systemctl enable gosite.service

创建自己的/init可执行文件

这不是你想要的,但很有趣!

只需选择一个任意的可执行文件,甚至是一个shell脚本,并使用命令行参数引导内核:

init=/path/to/myinit

在引导结束时,Linux内核在给定的路径上运行第一个用户空间可执行文件。

有几个项目提供了主流发行版(如systemd)所使用的流行的init可执行文件,并且在大多数发行版中,init会派生出一堆用于正常系统操作的进程。

但是我们可以劫持/初始化它来运行我们自己的最小脚本,以更好地理解我们的系统。

这里是一个最小的可复制设置:https://github.com/cirosantilli/linux-kernel-module-cheat/tree/f96d4d55c9caa7c0862991025e1291c48c33e3d9/README.md#custom-init

你可以这样做:

chmod +x PATH_TO_YOUR_SCRIPT/start_my_app 

然后使用下面的命令

update-rc.d start_my_app defaults 100

请参阅有关Cyberciti的本页。