在Linux上将 `.sh` 脚本、`.jar` 包或其他脚本文件添加到开机自启动

在Linux上将 .sh 脚本、.jar 包或其他脚本文件添加到开机自启动

在Linux环境中,有时需要将一些程序、脚本或应用程序设置为开机时自动启动。这对于那些需要在系统启动时启动的服务或应用非常有用。本文将介绍如何将 .sh 脚本、.jar 包或其他脚本文件添加到Linux系统的开机自启动中。

1. 使用 systemd 设置开机自启动

systemd 是大多数现代Linux发行版(如Ubuntu 16.04+、CentOS 7+等)的初始化系统。通过 systemd,可以将脚本、程序或服务添加到开机自启动中。

步骤 1:创建一个自定义的服务文件
  1. 打开终端,创建一个新的 systemd 服务文件。通常,这些服务文件存放在 /etc/systemd/system/ 目录下,my-script 可自定义自己的服务名称。

    sudo vim  /etc/systemd/system/my-script.service
    
  2. 在服务文件中,写入如下内容,并把/path/your/dir

    [Unit]
    Description=auto Start Project
    After=network.target syslog.target
    
    [Service]
    Type=forking
    Restart=on-failure
    RestartSec=10
    LimitNOFILE=65535
    PrivateTmp=true
    WorkingDirectory=/path/your/dir
    ExecStart=/usr/bin/bash /path/your/dir/start.sh
    ExecStop=/usr/bin/bash /path/your/dir/stop.sh
        
    [Install]
    WantedBy=multi-user.target
    

    解释:

    • [Unit] 部分定义服务的描述和依赖关系。

    • After network.target 表示网络服务已经启动并可用,syslog.target 表示系统日志服务已经启动并可用

    • [Service] 部分指定要执行的命令,ExecStart 用来指定脚本的路径。

    • Restart 定义服务在失败时的重启策略,on-failure表示当服务因失败(如非零退出码、被信号终止等)退出时,systemd会自动重启服务。

    • RestartSec 定义服务重启的间隔时间(单位:s)。

    • LimitNOFILE 设置服务允许打开的最大文件数。

    • PrivateTmp 为服务创建独立的临时目录,PrivateTmp=true表示为服务创建一个独立的/tmp目录,防止服务访问全局/tmp目录中的文件。这可以提高安全性,避免服务之间的临时文件冲突。

    • WorkingDirectory 指定脚本执行的工作目录。

    • ExecStart 指定服务启动时运行的脚本或命令,这里表示使用/usr/bin/bash运行$project_dir/start.sh脚本。

    • ExecStop 指定服务停止时运行的脚本或命令,这里表示使用/usr/bin/bash运行$project_dir/stop.sh脚本。

    • [Install] 部分定义服务在哪个目标下运行,multi-user.target 表示多用户环境下启动。

systemd 服务文件中,TypeRestartRestartSecLimitNOFILEPrivateTmp 是常用的参数配置选项。每个选项都有特定的用途和行为。下面是这些参数的详细解释和可选项:

  1. Type
    Type 用于定义服务的启动类型,指定 systemd 如何识别和管理服务进程。常见的选项有:
  • simple
    默认类型。systemd 假设服务是一个简单的前台进程,启动后会一直运行,直到退出。适用于大多数服务。

  • forking
    如果服务是一个父进程(通常是守护进程),并在启动时会分叉(即父进程退出,而子进程继续运行),则应使用 forking。在这种模式下,systemd 会等待服务的父进程退出并认为它已启动完毕,实际上是监视子进程。

  • oneshot
    适用于一次性任务,在启动时运行并且立即完成。systemd 不会持续监控此服务的状态。

  • notify
    如果服务使用 sd_notify()systemd 发送通知以指示其已启动或完成,使用 notify 类型。服务需要主动通知 systemd 启动状态。

  • idle
    服务在 systemd 的空闲时间启动,适用于延迟启动任务。

  1. Restart
    Restart 用于指定服务崩溃后的重启策略。常用的选项包括:
  • no
    不会在服务崩溃后自动重启,这是默认设置。

  • always
    无论服务是正常退出还是异常退出,都会尝试重新启动服务。

  • on-failure
    只有在服务非正常退出时(即退出码非零)才会重启。适用于希望在服务崩溃时自动重启,但正常退出时不重启的情况。

  • on-abort
    只有在服务因信号退出(通常是 SIGABRT 或其他致命信号)时才会重启。

  • unless-stopped
    服务会在失败时重启,除非用户手动停止服务。

  1. RestartSec
    RestartSec 用来配置在尝试重启服务之前等待的时间(秒)。这对于防止服务崩溃后立即重启非常有用,尤其是在服务可能需要一段时间来恢复或解决问题时。

  2. LimitNOFILE
    LimitNOFILE 设置服务进程可以打开的最大文件描述符数量。Linux 系统中,进程能够打开的文件、套接字等资源数量是有限制的,适当增加此限制可以提高某些服务(如数据库服务、Web 服务器等)的性能,尤其是在高并发场景下。

  3. PrivateTmp
    PrivateTmp 用来控制服务是否使用独立的临时目录。启用此选项时,服务会使用独立于系统默认临时目录(如 /tmp/var/tmp)的临时空间,这样可以提高服务的安全性,防止其他进程访问其临时文件。

步骤 2:重新加载 systemd 配置并启用服务
  1. 保存文件后,重新加载 systemd 配置并启用服务:

    sudo systemctl daemon-reload
    sudo systemctl enable my-script.service
    
  2. 启动服务:

    sudo systemctl start my-script.service
    
  3. 检查服务的状态:

    sudo systemctl status my-script.service
    

此时,脚本将在每次系统启动时自动执行。

2. 使用 crontab 设置开机自启动

除了 systemdcron 是另一种常用的定时任务调度工具。你可以使用 cron 来设置系统开机时执行某个任务。

步骤 1:编辑 crontab 文件
  1. 使用 crontab 编辑器打开 cron 配置文件:

    crontab -e
    
  2. 在文件末尾添加如下行,以便在系统启动时执行脚本:

    @reboot /path/to/your/script.sh
    
  3. 如果你需要在脚本中启动 .jar 文件,可以使用类似的命令:

    @reboot java -jar /path/to/your/application.jar
    
  4. 保存并退出编辑器。

步骤 2:验证 cron 服务是否运行

确保 cron 服务正在运行,以便系统启动时可以执行任务:

sudo systemctl status cron

如果服务未启动,可以使用以下命令启动它:

sudo systemctl start cron

3. 使用 /etc/rc.local 文件设置开机自启动

在一些较老的Linux发行版中,可以通过编辑 /etc/rc.local 文件来设置开机自启动任务。

步骤 1:编辑 rc.local 文件
  1. 打开 /etc/rc.local 文件:

    sudo nano /etc/rc.local
    
  2. 在文件的 exit 0 行之前添加你希望开机启动的命令:

    /path/to/your/script.sh &
    
  3. 确保脚本命令末尾有一个 & 符号,这样脚本将在后台运行。

  4. 保存并退出编辑器。

步骤 2:赋予执行权限

确保 rc.local 文件具有执行权限:

sudo chmod +x /etc/rc.local

4. 使用 init.d 脚本设置开机自启动

init.d 脚本是传统的Linux开机启动方式,但在现代系统中,systemd 已经取代了它。不过,如果你使用的是较旧的Linux版本,依然可以使用 init.d 脚本来设置开机启动。

步骤 1:创建 init.d 脚本
  1. /etc/init.d/ 目录下创建脚本文件:

    sudo nano /etc/init.d/myscript
    
  2. 编写脚本内容:

    #!/bin/bash
    # Description: My custom script
    # Start the script
    /path/to/your/script.sh
    
  3. 赋予脚本执行权限:

    sudo chmod +x /etc/init.d/myscript
    
步骤 2:启用服务

将脚本添加到开机启动项:

sudo update-rc.d myscript defaults

总结

在Linux中,可以通过多种方法设置脚本、.jar 文件或其他程序在系统启动时自动运行。使用 systemd 是目前推荐的方式,因为它提供了更多的灵活性和控制。如果系统不支持 systemd,则可以选择使用 cron 或传统的 rc.localinit.d 脚本。

无论选择哪种方法,都应确保脚本或程序路径正确,权限设置得当,并且服务能够正确启动。

希望本文帮助你理解如何在Linux上设置脚本或程序的开机自启动!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LOVE_DDZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值