如何在启动时运行shell脚本

mee*_*mit 344 linux init.d node.js forever

在亚马逊linux实例上,我有两个调用的脚本start_my_app,stop_my_app它们永远启动和停止(这反过来运行我的node.js应用程序).我使用这些脚本手动启动和停止我的节点应用程序.到现在为止还挺好.

我的问题:我也想设置它,以便start_my_app在系统启动时运行.我知道我需要在里面添加一个文件init.d,我知道如何将它符号链接到其中的正确目录rc.d,但无法弄清楚我放入的文件中究竟需要的内容init.d.我认为它应该只是一行,比如start_my_app,但这对我来说并不适用.

小智 307

为此设置一个crontab

#crontab -e
@reboot  /home/user/test.sh
Run Code Online (Sandbox Code Playgroud)

每次启动后,它都会运行测试脚本.

  • 这是最好的解决方案,crontab中的`@reboot sh $ HOME/test.sh`更加清晰 (16认同)
  • 它对我根本不起作用 (5认同)
  • 这是唯一对我有用的解决方案!谢谢 (4认同)
  • @MycrofD 你的 `crontab -l` 应该显示 `@reboot sh $HOME/test.sh` 以确认它确实已设置。 (4认同)
  • @ user3667089实际上,它不起作用.我打开终端,输入"crontab -e",出现一个窗口,我在"@reboot sh /home/user/test.sh"中写入,但它在启动时不运行.我在哪里做错了? (3认同)
  • 在 ubuntu 中你必须:`@reboot root sh script.sh` (3认同)

Jon*_*ler 279

在您输入的文件中,/etc/init.d/您必须将其设置为可执行文件:

chmod +x /etc/init.d/start_my_app
Run Code Online (Sandbox Code Playgroud)

感谢@meetamit,如果没有运行,你必须创建一个符号链接 /etc/rc.d/

ln -s /etc/init.d/start_my_app /etc/rc.d/
Run Code Online (Sandbox Code Playgroud)

请注意,在最新的Debian上,这将不起作用,因为您的脚本必须符合LSB(至少提供以下操作:启动,停止,重新启动,强制重新加载和状态): https://wiki.debian .ORG/LSBInitScripts

作为注释,您应该放置脚本的绝对路径而不是相对路径,它可以解决意外问题:

/var/myscripts/start_my_app
Run Code Online (Sandbox Code Playgroud)

并且不要忘记在该文件的顶部添加:

#!/bin/sh
Run Code Online (Sandbox Code Playgroud)

  • 在我的root的etc文件夹中没有rc.d目录..这让我目瞪口呆,这不是Linux需要启动的关键目录吗?它只是缺少我的操作系统似乎运行良好.我必须创建它吗?我看到一堆类似命名的文件,如"rc1.d",一直到"rc5.d" (21认同)
  • 我这样做了,它没有运行.它会自动运行,因为它位于/etc/init.d中,还是我需要做一些事情来安排它在系统启动时运行? (6认同)
  • @amphibient还不够......你还需要为这个文件创建一个符号链接(使用`ln`命令)到`rc.d`中的目录 (4认同)
  • 它取决于分布式但是,`rc-update add start_my_app` 应该足以让它在启动时使用参数“start”运行并使用参数“stop”关闭 (2认同)
  • 我没有`/ etc / rc.d`文件夹,但是有`/ etc / rcX.d`文件夹(即_ / etc / rc0.d _,_ / etc / rc1.d _,_ / etc / rcS .d_),还有一个文件** / etc / rc.local **。我认为您应该在自定义文件夹(如`/ etc / rc9.d`)或现有文件夹之一中创建符号链接(Ubuntu Server 14.04) (2认同)
  • 这个问题帮助了我:http://unix.stackexchange.com/questions/28679/whats-the-connection-between-etc-init-d-and-etc-rcx-d-directories-in-linu (2认同)
  • 我不明白“在您放入的文件中”这句话……有人可以澄清一下吗? (2认同)

Gil*_*not 121

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

/PATH/TO/MY_APP &
Run Code Online (Sandbox Code Playgroud)

或者如果要以root身份运行命令:

su - USER_FOOBAR -c /PATH/TO/MY_APP &
Run Code Online (Sandbox Code Playgroud)

(尾随&符号表示进程并允许rc.local继续执行)

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

cp /etc/init.d/skeleton /etc/init.d/your_app
Run Code Online (Sandbox Code Playgroud)

并适应它.

  • 似乎有人提到尾随的&符号表示进程并允许rc.local继续执行. (4认同)
  • 用户取决于您的应用.但如果不是绝对需要以root身份运行,请避免使用它.`&`在后台运行该过程 (3认同)
  • 谢谢!考虑到简单的要求,这种方法被证明是最有效的。我很确定我确实需要指定用户,否则当需要手动停止应用程序时(通过运行 `stop_my_app`)我必须用 `sudo` 这样做,不是吗?另外,我想知道尾随符号(?)的功能到底是什么。 (2认同)
  • 抱怨,抱歉,但我得把Koren的标记作为公认的答案,主要是因为@ erikb85指出的,但也因为我原来的问题要求`init.d`做事的方式(你的答案只是一个更简单的解决方法)我当时).这篇文章得到了很多观点和投票,因此保持准确是很重要的. (2认同)

Sau*_*ule 33

这是我在红帽系统上的方式

将您的脚本放入/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
Run Code Online (Sandbox Code Playgroud)

这表示脚本必须在级别3,4和5运行,并且启动/停止的优先级为99和10.

然后,作为root用户,您可以使用它chkconfig来启动或禁用启动时的脚本,

chkconfig --list apex
chkconfig --add apex
Run Code Online (Sandbox Code Playgroud)

你可以使用服务启动/停止顶点


小智 17

输入cron使用sudo:

sudo crontab -e

添加一个在启动时运行的命令,在本例中是一个脚本:

@reboot sh /home/user/test.sh

保存:

按ESC然后:x保存并退出,或按ESC然后ZZ(即shift + zz)

测试测试:

  1. 运行没有cron的测试脚本以确保它确实有效.

  2. 确保你在cron中保存了命令,使用 sudo crontab -e

  3. 重新启动服务器以确认它一切正常 sudo @reboot


Luc*_*cci 13

只需在你的crontab中添加一行代码..

确保该文件是可执行的:

chmod +x /path_to_you_file/your_file
Run Code Online (Sandbox Code Playgroud)

要编辑crontab文件:

crontab -e
Run Code Online (Sandbox Code Playgroud)

您必须添加的行:

@reboot  /path_to_you_file/your_file
Run Code Online (Sandbox Code Playgroud)

那很简单!


chr*_*ris 10

另一个选择是在crontab中有一个@reboot命令.

并非每个版本的cron都支持此功能,但如果您的实例基于Amazon Linux AMI,那么它将起作用.


Doh*_*ohd 6

使用nanogedit编辑器编辑 rc.local 文件并在其中添加您的脚本。文件路径可以是/etc/rc.local/etc/rc.d/rc.local

sudo nano /etc/rc.local
Run Code Online (Sandbox Code Playgroud)

这是编辑:

#!/bin/sh
/path-to-your-script/your-scipt-name.sh
Run Code Online (Sandbox Code Playgroud)

一旦完成后,按ctrl+o来更新,按Enter然后ctrl+x

使文件可执行。

sudo chmod 755 /etc/rc.local
Run Code Online (Sandbox Code Playgroud)

然后启动 rc-local 服务以在引导期间运行脚本。

sudo systemctl start rc-local
Run Code Online (Sandbox Code Playgroud)


小智 5

你能行的 :

chmod +x PATH_TO_YOUR_SCRIPT/start_my_app 
Run Code Online (Sandbox Code Playgroud)

然后使用此命令

update-rc.d start_my_app defaults 100
Run Code Online (Sandbox Code Playgroud)

请参阅Cyber​​citi上的此页面。


Rol*_*and 5

关于在启动时启动某些内容的答案有很多,但通常您想稍后启动它,因为您的脚本取决于网络等。用于at仅添加此延迟,例如:

at now + 1 min -f /path/yourscript
Run Code Online (Sandbox Code Playgroud)

您可以将其添加到 /etc/rc.local 中,也可以添加到cron以下内容中:

# crontab -e
@reboot at now + 1 min -f /path/yourscript
Run Code Online (Sandbox Code Playgroud)

把 cron 和 at 结合起来是不是很有趣?信息位于手册页中man at

至于评论说@reboot可能不会被广泛支持,试试吧。我发现 /etc/rc.local 在支持 systemd 的发行版(例如 ubuntu 和 raspbian)上已经过时。