在一个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,但这对我来说并不管用。
你放在/etc/init.的文件D /必须设置为可执行:
chmod +x /etc/init.d/start_my_app
正如@meetamit所指出的,如果它仍然不能运行,你可能必须创建一个到/etc/rc.d/文件的符号链接
ln -s /etc/init.d/start_my_app /etc/rc.d/
请注意,在最新版本的Debian上,这将不起作用,因为你的脚本必须与LSB兼容(至少提供以下操作:启动,停止,重新启动,强制重新加载和状态):
https://wiki.debian.org/LSBInitScripts
注意,你应该在你的脚本中使用文件的绝对路径,而不是相对路径,这可能会解决意想不到的问题:
/var/myscripts/start_my_app
最后,确保你在文件顶部包含了shebang:
#!/bin/sh
这是我在Red Hat Linux系统上执行的方法。
把你的脚本放在/etc/init.D,由根用户和可执行程序拥有。在脚本的顶部,您可以给出chkconfig指令。以oracle用户启动Java应用为例,执行以下脚本。
脚本名为/etc/init.d/apex
#!/bin/bash
# chkconfig: 345 99 10
# Description: auto start apex listener
#
case "$1" in
'start')
su - oracle -c "cd /opt/apex ; java -jar apex.war > logs/apex.log 2>logs/apex_error.log &";;
'stop')
echo "put something to shutdown or kill the process here";;
esac
这表示脚本必须在级别3、4和5上运行,启动/停止的优先级是99和10。
然后,作为root用户,你可以使用chkconfig在启动时启用或禁用脚本:
chkconfig --list apex
chkconfig --add apex
您可以使用服务启动/停止顶点。
创建自己的/init可执行文件
这不是你想要的,但很有趣!
只需选择一个任意的可执行文件,甚至是一个shell脚本,并使用命令行参数引导内核:
init=/path/to/myinit
在引导结束时,Linux内核在给定的路径上运行第一个用户空间可执行文件。
有几个项目提供了主流发行版(如systemd)所使用的流行的init可执行文件,并且在大多数发行版中,init会派生出一堆用于正常系统操作的进程。
但是我们可以劫持/初始化它来运行我们自己的最小脚本,以更好地理解我们的系统。
这里是一个最小的可复制设置:https://github.com/cirosantilli/linux-kernel-module-cheat/tree/f96d4d55c9caa7c0862991025e1291c48c33e3d9/README.md#custom-init
使用Python 3微服务或shell;使用Ubuntu Server 18.04 (Bionic Beaver)或Ubuntu 19.10 (Eoan Ermine)或Ubuntu 18.10 (Cosmic Cuttlefish)我总是喜欢这些步骤,而且它也总是有效:
Creating a microservice called p example "brain_microservice1.service" in my case:
$ nano /lib/systemd/system/brain_microservice1.service
Inside this new service that you are in:
[Unit]
Description=brain_microservice_1
After=multi-user.target
[Service]
Type=simple
ExecStart=/usr/bin/python3.7 /root/scriptsPython/RUN_SERVICES/microservices /microservice_1.py -k start -DFOREGROUND
ExecStop=/usr/bin/python3.7 /root/scriptsPython/RUN_SERVICES/microservices/microservice_1.py -k graceful-stop
ExecReload=/usr/bin/python3.7 /root/scriptsPython/RUN_SERVICES/microservices/microservice_1.py -k graceful
PrivateTmp=true
LimitNOFILE=infinity
KillMode=mixed
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
Give the permissions:
$ chmod -X /lib/systemd/system/brain_microservice*
$ chmod -R 775 /lib/systemd/system/brain_microservice*
Give the execution permission then:
$ systemctl daemon-reload
Enable then, this will make then always start on startup
$ systemctl enable brain_microservice1.service
Then you can test it;
$ sudo reboot now
Finish = SUCCESS!!
这可以用相同的主体脚本来运行shell, react…数据库启动脚本…任何类型的OS代码…希望这能帮助你…
...
我参考了这个博客,总是听起来不错的选择
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
这里有一个更简单的方法!
首先:编写一个shell脚本并将其保存为.sh
这里有一个例子
#!/bin/bash
Icoff='/home/akbar/keyboardONOFF/icon/Dt6hQ.png'
id=13
fconfig=".keyboard"
echo "disabled" > $fconfig
xinput float $id
notify-send -i $Icoff "Internal Keyboard disabled";
这个脚本将在启动时禁用内部键盘。
第二步:打开应用程序“启动应用程序首选项”
在这里输入图像描述
在这里输入图像描述
第三:单击“添加”。
第四:在NAME部分给出一个名字。
第五:在命令部分浏览到你的.sh。
第六:编辑你的命令部分:
bash <space> path/to/file/<filename>.sh <space> --start
第七步:点击添加。完成了!
现在重新启动你的电脑来确认。
干杯!
编辑rc。本地文件使用nano或gedit编辑器,并添加您的脚本在其中。文件路径可以是“/etc/rc”Local或/etc/rc.d/rc. Local。
sudo nano /etc/rc.local
编辑如下:
#!/bin/sh
/path-to-your-script/your-scipt-name.sh
一旦完成按ctrl+o更新,再按ctrl+x。
使文件可执行。
sudo chmod 755 /etc/rc.local
然后在引导期间启动rc-local服务以运行脚本。
sudo systemctl start rc-local
很多答案都是在启动时启动某个东西,但通常你想稍微晚一点启动它,因为你的脚本依赖于例如网络。使用at只是添加这个延迟,例如:
at now + 1 min -f /path/yourscript
你可以在/etc/rc.中添加本地的,还在cron喜欢:
# crontab -e
@reboot at now + 1 min -f /path/yourscript
把cron和at结合起来是不是很有趣?信息在手册页。
至于@reboot可能不被广泛支持的评论,试试看吧。我发现/etc/rc.Local在支持systemd的发行版上已经过时了,比如ubuntu和raspbian。