如何在启动时运行一个shell脚本
在一个亚马逊Linux实例中,我有两个名为start_my_app
和stop_my_app
脚本,它们永远启动和停止(反过来运行我的node.js应用程序)。 我使用这些脚本来手动启动和停止我的节点应用程序。 到现在为止还挺好。
我的问题:我也想设置它, start_my_app
系统启动时运行start_my_app
。 我知道我需要在init.d
添加一个文件,我知道如何将它符号链接到rc.d
的正确的目录,但是不知道在init.d
文件中究竟需要什么内容。 我认为它应该只是一条线,就像start_my_app
,但是这并没有为我工作。
在/etc/init.d/
文件中,您必须将其设置为可执行文件:
chmod +x /etc/init.d/start_my_app
感谢@meetamit,如果不运行,你必须创build一个符号链接到/etc/rc.d/
ln -s /etc/init.d/start_my_app /etc/rc.d/
请注意,在最新的Debian中,这将不起作用,因为您的脚本必须符合LSB(至less提供以下操作:启动,停止,重新启动,强制重新加载和状态): https://wiki.debian .ORG / LSBInitScripts
请注意,您应该放置脚本的绝对path而不是相对path,这可能会解决意外的问题:
/var/myscripts/start_my_app
不要忘记添加该文件的顶部:
#!/bin/sh
为此设置一个crontab
#crontab -e @reboot /home/user/test.sh
每次启动后,它将运行testing脚本。
一个简单的方法是在/etc/rc.local
添加一行:
/PATH/TO/MY_APP &
或者如果你想以root身份运行该命令:
su - USER_FOOBAR -c /PATH/TO/MY_APP &
(尾随符号背景进程,并允许rc.local继续执行)
如果你想要一个完整的init脚本,debian distro有一个模板文件,所以:
cp /etc/init.d/skeleton /etc/init.d/your_app
并适应一下。
这是我在红帽系统上的做法
把你的脚本放在/etc/init.d
,由root和可执行文件拥有。 在脚本的顶部,你可以给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
您可以使用服务启动/停止顶点
另一种select是在你的crontab中有一个@reboot命令。
并不是每个版本的cron都支持这个function,但是如果您的实例基于Amazon Linux AMI,那么它就可以工作。
只需将一行添加到您的crontab中。
确保文件是可执行的:
chmod +x /path_to_you_file/your_file
编辑crontab文件:
crontab -e
你必须添加行:
@reboot /path_to_you_file/your_file
那简单!
你能行的 :
chmod +x PATH_TO_YOUR_SCRIPT/start_my_app
然后使用这个命令
update-rc.d start_my_app defaults 100
请在Cyberciti上查看此页面。
对于Debian 9,请参阅https://askubuntu.com/questions/228304/how-do-i-run-a-script-at-start-up 。 这帮助了我。 Debian 9的简短版本:将命令(以root身份)添加到/etc/rc.local
/path_to_file/filename.sh || exit 1 # Added by me exit 0
可能, /path_to_file/filename.sh应该是可执行的(我这么认为)。
创build你自己的/ init可执行文件
这不是你想要的,但它很有趣!
只需select一个任意的可执行文件, 甚至是一个shell脚本 ,然后用命令行参数启动内核:
init=/path/to/myinit
在启动结束时,Linux内核运行给定path上的第一个用户空间可执行文件。
有几个项目提供了主stream发行版(如systemd)使用的常用init
可执行文件,而在大多数发行版中,init会分叉正常系统操作中使用的一系列进程。
但是我们可以劫持/init
它来运行我们自己的最小脚本来更好地理解我们的系统。
这是一个最小可重现的设置: https : //github.com/cirosantilli/linux-kernel-module-cheat/tree/f96d4d55c9caa7c0862991025e1291c48c33e3d9/README.md#custom-init
如果你想运行的绝对最简单的方法是一个简单的脚本,(或任何东西)是如果你有一个GUI使用系统>喜好,然后启动应用程序。
只需浏览到你想要的脚本,然后去那里。 (使脚本可执行)
这个简单的解决scheme在运行CentOS的Amazon Linux实例上为我工作。 编辑你的/etc/rc.d/rc.local
文件并把命令放在那里。 在这个文件中提到它会在所有其他init脚本之后执行。 所以在这方面要小心。 这是当前文件的目录。 。 最后一行是我的脚本的名字。
- 将您的脚本添加到/etc/init.d/目录
- 更新你的rc运行级别:
$ update-rc.d myScript.sh defaults NN
其中NN是应该执行的顺序。 99例如将意味着它将在98和100之前运行。
*** Hemant kumar有这个最好的解决scheme
使用sudoinputcron:
“sudo crontab -e”
添加一个命令启动运行,在这种情况下脚本:
“@reboot sh /home/user/test.sh”
保存:
按ESC然后:x保存并退出,或按ESC然后ZZ(这是shift + zz)
testingtestingtesting:
运行你的testing脚本没有cron来确保它实际上工作
确保你保存你的命令在cron中,使用“sudo crontab -e”
重新启动服务器以确认所有工作“sudo @reboot”
对于一些人来说,这将起作用您可以简单地将以下命令添加到系统>首选项>启动应用程序:
bash /full/path/to/your/script.sh
如果你想把启动也可以使用
首先移动你的脚本/etc/init.d然后chmod 777 /etc/init.d/你的脚本名
应用下面的命令后
update-rc.d你的脚本默认删除update-rc.d -f你的脚本删除
在启动时,你可以看到你的应用程序将运行。