几种linux开机自启脚本的方法

几种linux开机自启脚本的方法

    • 1. 脚本添加到init.d目录中
    • 2. 创建服务service(推荐)
    • 3. /etc/profile & /etc/profile.d(不推荐)
    • 4. /etc/rc.local

本文以启动jenkins节点为例,需要持久连接,实现开机自启

1. 脚本添加到init.d目录中

runlevel 3为例

流程:
1. 编写脚本,并赋权为可执行

root@ubuntu1:/etc/init.d# cat jenkins_agent.sh
#!/bin/bash
nohup /usr/bin/java -jar /usr/local/share/agent.jar -jnlpUrl http://192.168.5.54:8080/computer/70%2E140/jenkins-agent.jnlp -secret 67d842f7fc00f1627a1e9cf5a3901689dae8522a6fe8cc658bd0a0c73023fafb -workDir "/usr/share/jenkins" &>/dev/null &
root@ubuntu1:/etc/init.d# chmod a+x jenkins_agent.sh

这里还是需要注意下,首行#!/bin/bash指定shell运行是必须要写的,否则会报错Failed at step EXEC spawning /etc/init.d/jenkins_agent.sh: Exec format error。另外脚本中出现的文件都需要使用绝对路径。

  1. 创建链接

关于rc*.d下软链接的命名:
此类链接文件一般以K或S开头,其中K表示停止(Kill)一个服务,会向脚本传递stop参数;S表示启动(Start)一个服务,会向脚本传递start参数;所以他们可以指向同一个脚本文件,只是传递不同的参数,以产生不同执行结果。
S\K后面会跟数字,表示脚本的执行顺序,数字越小执行顺序越靠前。

如果希望在runlevel 3启动时,启动脚本,则需要

	ln -s /etc/init.d/jenkins_agent.sh /etc/rc3.d/S95jenkins_agent

如果是runlevel 5启动

ln -s /etc/init.d/jenkins_agent.sh /etc/rc5.d/S95jenkins_agent

这里也可以通过update-rc.d来创建链接,不过这里不推荐了,原因有三:
① 并非centos系统默认程序,ubuntu默认自带
② 脚本需要遵守init.d中启动脚本编写规范,有一定学习成本
③ 在某些版本设置完成后,启动顺序有所变化

当完成后,可以看到脚本已正常运行,并且在日志中也有所体现

root@ubuntu1:/etc/init.d# journalctl -xe|grep jenkins
Jun 27 23:00:35 ubuntu1 systemd[1]: Starting jenkins_agent.service...
-- Subject: Unit jenkins_agent.service has begun start-up
-- Unit jenkins_agent.service has begun starting up.
Jun 27 23:00:35 ubuntu1 systemd[1]: Started jenkins_agent.service.
-- Subject: Unit jenkins_agent.service has finished start-up
-- Unit jenkins_agent.service has finished starting up.

总的来说,这种方式简单粗暴

2. 创建服务service(推荐)

把脚本创建为服务,通过systemd管理

这里我们把前面创建的脚本链接删除

root@ubuntu1:/etc/init.d# mv /etc/rc3.d/S95jenkins_agent /dev/null
root@ubuntu1:/etc/init.d# mv /etc/rc5.d/S95jenkins_agent /dev/null
root@ubuntu1:/etc/init.d# ps -ef|grep java|grep -v 'grep'

一般service都存放于/lib/system/system目录下,以xxx.service命名,且内部采用统一的格式:

[Unit]
Description=xxxxxxxxxxxxxxxx         #描述服务 
After=network.target                 #用于指定服务启动的前置条件
Documentation=                       #帮助文件的地址,可缺省
 
[Service]
#Type= 启动时进程行为,比如设为:simple
#EnvironmentFile= 指定环境变量,不指定可以设为no
#User=  启动用户
#Group=  启动用户组
ExecStart=  /usr/bin/test            #服务启动命令,此项必填
ExecStop=   /usr/bin/test            #服务终止命令,可缺省
#Restart= 指定重启条件,比如设为:on-failure
#RestartSec= 自动重启当前服务的间隔秒数,比如设为:1s
 
 
[Install]                            #用来定义如何启动,以及是否开机启动。
WantedBy=multi-user.target           #当服务开机启动后,会放入什么文件夹,影响启动顺序

修改后的service文件

Unit]
Description=jenkins agent start
After=network.target
Documentation=

[Service]
ExecStart= /usr/bin/java -jar /usr/local/share/agent.jar -jnlpUrl http://192.168.5.54:8080/computer/70%2E140/jenkins-agent.jnlp -secret 67d842f7fc00f1627a1e9cf5a3901689dae8522a6fe8cc658bd0a0c73023fafb -workDir "/usr/share/jenkins"
[Install]
WantedBy=multi-user.target

这样我们就可以通过systemd进行管理该脚本

root@ubuntu1:/lib/systemd/system# systemctl enable jenkins-agent.service
Created symlink from /etc/systemd/system/multi-user.target.wants/jenkins-agent.service to /lib/systemd/system/jenkins-agent.service.
root@ubuntu1:/lib/systemd/system# systemctl start jenkins-agent.service
root@ubuntu1:/lib/systemd/system# systemctl status jenkins-agent.service
● jenkins-agent.service - jenkins agent start
   Loaded: loaded (/lib/systemd/system/jenkins-agent.service; disabled; vendor preset: enabled)
   Active: active (running) since Fri 2024-06-28 00:29:14 PDT; 2s ago
 Main PID: 19035 (java)
   CGroup: /system.slice/jenkins-agent.service
           └─19035 /usr/bin/java -jar /usr/local/share/agent.jar -jnlpUrl http://192.168.5.54:8080/computer/70%2E140/jenkins-agent.jnlp -secret 67d842f7fc00f1627a1e9cf5a3901689dae8522a6fe8cc658bd0a0
...
root@ubuntu1:/lib/systemd/system# systemctl stop jenkins-agent.service
root@ubuntu1:/lib/systemd/system# systemctl status jenkins-agent.service
● jenkins-agent.service - jenkins agent start
   Loaded: loaded (/lib/systemd/system/jenkins-agent.service; disabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Fri 2024-06-28 00:32:35 PDT; 2s ago
  Process: 19183 ExecStart=/usr/bin/java -jar /usr/local/share/agent.jar -jnlpUrl http://192.168.5.54:8080/computer/70%2E140/jenkins-agent.jnlp -secret 67d842f7fc00f1627a1e9cf5a3901689dae8522a6fe8cc
 Main PID: 19183 (code=exited, status=143)
...

这种方法比较推荐,关于systemd管理文件如何编写,可以参考 https://blog.csdn.net/u010230019/article/details/132336029

3. /etc/profile & /etc/profile.d(不推荐)

不建议把启动脚本写在/etc/profile/etc/profile.d中,虽然可以这么做,原因:
/etc/profile & /etc/profile.d中的脚本或命令,每次用户登录都会加载执行,所以如果某些提供服务的脚本放在此处,每次用户登录都会执行该脚本或命令

cp /etc/init.d/jenkins_agent.sh /etc/profile.d/
root@ubuntu1:~# exit
logout
yurq@ubuntu1:~$ sudo -i
root@ubuntu1:~# ps -ef|grep java
root       2105      1  2 01:02 pts/0    00:00:09 /usr/bin/java -jar /usr/local/share/agent.jar -jnlpUrl http://192.168.5.54:8080/computer/70%2E140/jenkins-agent.jnlp -secret 67d842f7fc00f1627a1e9cf5a3901689dae8522a6fe8cc658bd0a0c73023fafb -workDir /usr/share/jenkins
root       5149   5071  0 01:10 pts/0    00:00:00 grep --color=auto java
[1]+  Exit 255                nohup /usr/bin/java -jar /usr/local/share/agent.jar -jnlpUrl http://192.168.5.54:8080/computer/70%2E140/jenkins-agent.jnlp -secret 67d842f7fc00f1627a1e9cf5a3901689dae8522a6fe8cc658bd0a0c73023fafb -workDir "/usr/share/jenkins" &> /dev/null

/etc/profile & /etc/profile.d主要还是用来设置环境变量,以及一些用户的特殊设置。对于不需要以服务形式提供的脚本,实际也是可以放到此处的。

具体来说,/etc/profile文件的作用包括:

  • 设置系统范围的环境变量:可以在该文件中定义系统级别的环境变量,这些环境变量会被所有用户的shell会话继承。
  • 执行全局的shell脚本:可以在该文件中执行一些需要在系统启动时执行的脚本,比如初始化系统环境、加载特定的模块等操作。
  • 配置全局的shell选项:可以在该文件中设置系统范围内的shell选项,比如设置命令提示符、历史记录、自动补全等。

总的来说,/etc/profile文件是用来配置系统范围的shell环境和行为的,可以对系统的整体行为进行一些设置和调整。

4. /etc/rc.local

在最新的linux发行版中,/etc/rc.local文件默认已经不存在了,如果需要可能要手动创建

可以在/etc/rc.local中加入执行的脚本,例如

yurq@ubuntu1:~$ tail /etc/rc.local
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

#!/bin/bash
nohup /usr/bin/java -jar /usr/local/share/agent.jar -jnlpUrl http://192.168.5.54:8080/computer/70%2E140/jenkins-agent.jnlp -secret 67d842f7fc00f1627a1e9cf5a3901689dae8522a6fe8cc658bd0a0c73023fafb -workDir "/usr/share/jenkins" &>/dev/null &

虽然ubuntu中没有提示加执行权限,但在centos中有提到,不过说明的位置和文件实际位置略有差异。

[root@node-254 ~]# cat /etc/rc.local
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.

所以,如果能让脚本开机自启,还需要加执行权限

chmod +x /etc/rc.local

重启后,仍可以达到效果

yurq@ubuntu1:~$ ps -ef|grep java
root        795      1 61 01:21 ?        00:00:07 /usr/bin/java -jar /usr/local/share/agent.jar -jnlpUrl http://192.168.5.54:8080/computer/70%2E140/jenkins-agent.jnlp -secret 67d842f7fc00f1627a1e9cf5a3901689dae8522a6fe8cc658bd0a0c73023fafb -workDir /usr/share/jenkins
yurq        968    915  0 01:21 pts/0    00:00:00 grep --color=auto java

对于这种方式,笔者谈不上推荐或不推荐,因为在最新的linux发行版中,该文件已经默认不存在了,所以有很大概率在未来的某个版本开始,将彻底移除这个功能。如果不看那么长远,现在使用倒是也还可以。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/753221.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据组件--Hue

Apache Hue hue是一个集成化的大数据可视化软件,可以通过hue访问浏览操作主流的大数据生态圈软件。hue本身来自于cloudera后来贡献给了apachehue本身是一个web项目,基于python实现的,通过该web项目的UI集成了各个软件的UI 下面是一个hue调度…

远程桌面无法复制粘贴文件到本地怎么办?

远程桌面不能复制粘贴问题 Windows远程桌面为我们提供了随时随地访问文件和数据的便捷途径,大大提升了工作和生活的效率。然而,在使用过程中,我们也可能遇到一些问题。例如,在通过远程桌面传输文件时,常常会出现无法复…

什么软件可以做计划 能做待办计划的app

在快节奏的现代生活中,做计划已成为许多人提高效率、管理时间的重要方法。无论是学生安排学习进度,还是职场人士规划工作任务,一份清晰的计划都能帮助我们更好地掌控生活节奏,实现目标。 选择一款好用的待办软件来做计划&#xf…

报错及解决问题记录

解决: sudo vim /etc/hosts

金融科技如何以细颗粒度服务提升用户体验与满意度

在金融科技迅速发展的当下,各种技术手段被广泛应用于提升用户体验与满意度。这些技术手段不仅提供了更为精准、个性化的服务,还通过优化操作流程、提升服务效率等方式,显著改善了用户的金融生活。以下将详细探讨金融科技如何运用这些技术手段…

图数据库 vs 向量数据库

最近大模型出来之后,向量数据库重新翻红,业界和市场上有不少声音认为向量数据库会极大的影响图数据库,图数据库市场会萎缩甚至消失,今天就从技术原理角度来讨论下图数据库和向量数据库到底差别在哪里,适合什么场景&…

昇思25天学习打卡营第3天|数据集全攻略:加载、操作与自定义

导入数据集相关库和类 首先,导入了 NumPy 库,并将其简称为 np 。要知道,NumPy 乃是用于科学计算的关键库,作用非凡。接着,从 mindspore.dataset 当中导入了 vision 模块。此外,还从 mindspore.dataset 里引…

C++使用Poco库封装一个HTTP客户端类

0x00 前言 我们在使用HTTP协议获取接口数据时,通常需要在Header和Query中添加参数,还有一种就是在Body中追加XML或者JSON格式的数据。本文主要讲述使用Poco库提交HTTP Post请求的Body中附加XML格式的数据,JSON格式的数据类似。 0x01 HttpCl…

禹神electron学习~

最近时间比较富裕 咱们浅浅来学习下electron 视频在这禹神:一小时快速上手Electron,前端Electron开发教程_哔哩哔哩_bilibili 先看下流程模型 先决条件 首先第一步 查看你的node和npm版本 创建你的应用 创建一个文件夹 我创建的名称为my-electron-…

人工智能期末复习思维导图,参考人工智能及其应用(第6版)和柴玉梅老师教材

其中第一、六、七、八、九章不用重点看,计算题一般会考1.语义网络、谓词逻辑,2.可信度,3.主观贝叶斯,4.一般合一置换,5.证据理论,6.盲目搜索。 第一章:绪论 第二章:知识表示方法 第…

MQ - RabbitMQ、SpringAMQP --学习笔记

什么是MQ? MQ 是消息队列(Message Queue)的缩写,它是一种应用程序间异步通信的技术。消息队列允许应用程序或服务间通过发送消息来交换数据,而不是直接调用对方,从而实现解耦、异步处理和负载均衡等目的。…

无需高配置 怎么获得超流畅的VR体验?

传统VR眼镜在使用中存在一些显著不足,而实时渲染技术又是如何解决的?接下来与大家共同探讨遇到的问题以及实时渲染在VR眼镜中的实际应用。 1、高配置要求 目前主流VR一体机的眼镜需要较高配置才能运行普通VR内容,且受限于VR眼镜的算力限制&…

工作纪实51-手撸AB实验分流策略

前几天写了一篇关于哈希算法的文章,起源就是在构思AB实验平台的时候,用到了哈希,所以对其做了深入的了解 AB实验平台是一般互联网做策略、样式实验会用到的一个系统,一般开启某个实验之后,需要对线上流量进行分流&…

太速科技-FMC144 -八路 250MSPS 14bit AD FMC子卡

FMC144 -八路 250MSPS 14bit AD FMC子卡 一、板卡概述   FMC144是一款具有8通道模数转换器(ADC)的FMC卡,具有14bit分辨率,最大采样速率达250Msps。时钟配置芯片为AD9516-1,可由板载10MHz时钟提供参考,也可…

[游戏开发][UE5]引擎学习记录

C Log和蓝图Log C Log 方法 UE_Log(参数1,参数2,参数3) //举例: UE_LOG(LogTemp, Error, TEXT("Log Info: %s"),"Test Log"); 三个参数的作用 参数1:输出窗口归类使用,你写什么它就显示什么 参数2&#x…

node.js安装

下载地址 https://nodejs.org/en/download 安装教程

Stable Diffusion初体验——提示词指南

前言 Stable Diffusion是一种深度学习模型,它能够根据提示词生成高质量的图像。在Stable Diffusion模型中,提示词起着至关重要的作用,因为它们为模型提供了关于所需输出的指导。本文将探讨Stable Diffusion关于提示词的原理,包括…

k8s集群node节点加入失败

出现这种情况: [preflight] FYI: You can look at this config file with kubectl -n kube-system get cm kubeadm-config -o yaml [kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml" [kubelet-start] Writing kub…

计算机网络——数据链路层(数据链路层概述及基本问题)

链路、数据链路和帧的概念 数据链路层在物理层提供服务的基础上向网络层提供服务,其主要作用是加强物理层传输原始比特流的功能,将物理层提供的可能出错的物理连接改造为逻辑上无差错的数据链路,使之对网络层表现为一条无差错的链路。 链路(…

sheng的学习笔记-AI-K均值算法

ai目录:sheng的学习笔记-AI目录-CSDN博客 需要学习前置知识:聚类,可参考 sheng的学习笔记-聚类(Clustering)-CSDN博客 目录 什么是k均值算法 流程 伪代码 数据集 伪代码 代码解释 划分示意图 优化目标 随机初始化 选择聚类数…