如何在启动时运行一个shell脚本

在一个亚马逊Linux实例中,我有两个名为start_my_appstop_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 

请在Cyber​​citi上查看此页面。

对于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你的脚本删除

在启动时,你可以看到你的应用程序将运行。