0


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

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

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

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

runlevel 3

为例

流程:

  1. 编写脚本,并赋权为可执行
root@ubuntu1:/etc/init.d# cat jenkins_agent.sh#!/bin/bashnohup /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 2723: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 2723: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: 19183ExecStart=/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:~# exitlogout
yurq@ubuntu1:~$ sudo-i
root@ubuntu1:~# ps -ef|grep java
root       210512 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       514950710 01:10 pts/0    00:00:00 grep--color=auto java[1]+  Exit 255nohup /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/bashnohup /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|grepjava
root        795161 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        9689150 01:21 pts/0    00:00:00 grep--color=auto java

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

标签: linux 运维 服务器

本文转载自: https://blog.csdn.net/u010230019/article/details/140042045
版权归原作者 壹只菜鸟 所有, 如有侵权,请联系我们删除。

“几种linux开机自启脚本的方法”的评论:

还没有评论