如何在启动时运行shell脚本

问题描述 投票:321回答:17

在亚马逊linux实例上,我有两个名为start_my_appstop_my_app的脚本,它们启动和停止forever(后者运行我的node.js应用程序)。我使用这些脚本手动启动和停止我的节点应用程序。到现在为止还挺好。

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

linux node.js init.d forever
17个回答
265
投票

在您放入/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

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

#!/bin/sh

1
投票

This简单的解决方案在运行CentOS的Amazon Linux实例上为我工作。编辑你的/etc/rc.d/rc.local文件并将命令放在那里。在此文件中提到它将在所有其他init脚本之后执行。所以在这方面要小心。这就是该文件目前在寻找我的方式.enter image description here。最后一行是我的脚本的名称。


1
投票

对于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应该是可执行的(我想是这样)。


0
投票

绝对最简单的方法,如果你想要运行的只是一个简单的脚本(或任何东西),如果你有一个gui来使用系统>首选项然后启动应用程序。

只需浏览到您想要的脚本即可。 (使脚本可执行)


0
投票
  • 将您的脚本添加到/etc/init.d/目录
  • 更新你的rc运行级别:$ update-rc.d myScript.sh defaults NN,其中NN是应该执行它的顺序。例如,99意味着它将在98之后和100之前运行。

0
投票

在Lubuntu,我不得不处理相反的情况。 Skype在启动后开始运行,我在~/.config/autostart/找到了文件skypeforlinux.desktop。该文件的内容如下:

[Desktop Entry]
Name=Skype for Linux
Comment=Skype Internet Telephony
Exec=/usr/bin/skypeforlinux
Icon=skypeforlinux
Terminal=false
Type=Application
StartupNotify=false
X-GNOME-Autostart-enabled=true

删除此文件对我有帮助。


0
投票

无痛,最简单,最通用的方法就是使用~.bash_profile~.profile执行它(如果你没有bash_profile文件)。

只需在该文件的底部添加执行命令,它将在系统启动时执行。

我在底部有一个例子; ~\Desktop\sound_fixer.sh


-7
投票

对于某些人,这将工作你可以简单地将以下命令添加到系统>首选项>启动应用程序:

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

-23
投票

如果你想放置启动也可以使用

首先移动你的脚本/etc/init.d然后chmod 777 /etc/init.d/你的脚本名称

应用以下命令后

update-rc.d你的脚本默认删除update-rc.d -f你的脚本删除

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


274
投票

为此设置一个crontab

#crontab -e
@reboot  /home/user/test.sh

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


119
投票

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

/PATH/TO/MY_APP &

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

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

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

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

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

并适应它。


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

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

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

chkconfig --list apex
chkconfig --add apex

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


15
投票

使用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

13
投票

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

确保该文件是可执行的:

chmod +x /path_to_you_file/your_file

要编辑crontab文件:

crontab -e

您必须添加的行:

@reboot  /path_to_you_file/your_file

那很简单!


9
投票

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

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


5
投票

你能行的 :

chmod +x PATH_TO_YOUR_SCRIPT/start_my_app 

然后使用此命令

update-rc.d start_my_app defaults 100

请在Cyberciti上查看此页面。


3
投票

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

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

只需选择一个任意的可执行文件even a shell script,然后使用命令行参数启动内核:

init=/path/to/myinit

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

几个项目提供了主要发行版使用的流行的init可执行文件,例如: systemd,在大多数发行版中,init会分叉正常系统操作中使用的一堆进程。

但我们可以劫持/init它运行我们自己的最小脚本,以更好地了解我们的系统。

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

© www.soinside.com 2019 - 2024. All rights reserved.