首页 文章

如何在启动时运行shell脚本

提问于
浏览
303

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

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

15 回答

  • -7

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

    确保该文件是可执行的:

    chmod +x /path_to_you_file/your_file
    

    要编辑crontab文件:

    crontab -e
    

    您必须添加的行:

    @reboot  /path_to_you_file/your_file
    

    那很简单!

  • 8

    使用 sudo 输入 cron

    sudo crontab -e

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

    @reboot sh /home/user/test.sh

    Save:

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

    Test Test Test

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

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

    • 重启服务器以确认一切正常 sudo @reboot

  • 0

    你能行的 :

    chmod +x PATH_TO_YOUR_SCRIPT/start_my_app
    

    然后使用此命令

    update-rc.d start_my_app defaults 100
    

    请在Cyberciti上查看此页面 .

  • 1

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

    为此设置一个crontab

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

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

  • 247

    一个简单的方法是在 /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
    

    并适应它 .

  • 0

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

    将您的脚本放在 /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
    

    并且您可以使用服务开始/停止顶点

  • -20

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

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

  • 30

    Create your own /init executable

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

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

    init=/path/to/myinit
    

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

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

    但是我们可以劫持 /init 它来运行我们自己的最小脚本来更好地理解我们的系统 .

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

  • 220

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

  • 10

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

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

  • 4

    This简单的解决方案适用于运行CentOS的Amazon Linux实例 . 编辑 /etc/rc.d/rc.local 文件并将命令放在那里 . 在此文件中提到它将执行 after 所有其他init脚本 . 所以在这方面要小心 . 这是文件当前查找我的方式 .
    enter image description here
    . 最后一行是我的脚本的名称 .

  • 116
    • 将脚本添加到/etc/init.d/目录

    • 更新你的rc运行级别: $ update-rc.d myScript.sh defaults NN 其中NN是应该执行它的顺序 . 例如99意味着它将在98之后和100之前运行 .

  • 0

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

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

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

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

    应用以下命令后

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

    在初创公司,你可以看到你的应用程序将运行 .

相关问题