Linux开机启动自定义脚本
一、Linux系统启动顺序
# 第一步:init /etc/inittab
# 第二步:启动相应的脚本(开机自启)
rc.sysinit(初始化系统服务)
/etc/rc.d/ (目录下的脚本)
/etc/rc.local
# 第三步:启动login登录界面(需要用户主动触发)
# 第四步:在用户登录的时候执行sh脚本的顺序,每次登录的时候都会完全执行的
/etc/profile.d/file
/etc/profile(其中包含执行/etc/profile.d/目录下的脚本)
/etc/bashrc
/root/.bashrc(~/.bashrc)
/root/.bash_profile(~/.bash_profile)
注意事项: Linux开机自启动程序无法读取环境变量问题,通常是因为启动脚本的环境和登录环境不一致。
如果你的环境变量定义在用户的.bashrc或.bash_profile中,而开机时使用的是systemd或init系统,它们可能不会加载用户的shell配置文件。
解决办法:
1.使用/etc/environment:这是全系统环境变量配置文件,对所有用户有效。编辑这个文件,添加你的环境变量。
2.使用systemd服务:如果你的程序是通过systemd服务启动的,可以在服务文件中手动设置环境变量。
3.使用/.profile或/.bashrc:如果你需要为特定用户设置环境变量,可以在该用户的home目录下的.profile或.bashrc文件中添加环境变量,并确保该用户登录时这些文件会被执行。
二、登录时被执行脚本
/etc/profile.d/ 是一个在 Linux 系统中用于存放在登录时会被执行的脚本的目录。
将写好的脚本(.sh文件)放到目录 /etc/profile.d/ 下,系统启动或登录时就会自动执行该目录下的所有shell脚本。
这些脚本通常用于设置环境变量,比如 PATH 环境变量,以便在用户登录时可以使用这些路径下的程序。
但请注意,由于不确定系统环境变量何时初始化完成,所以不推荐在此目录执行启动Java程序等需要特定环境变量的任务。
自定义脚本:/etc/profile.d/welcome.sh
echo 'welcome to myos!'
登录时被执行配置文件
/etc/profile文件包含了设置全局环境变量、系统级别的初始化命令、以及系统wide shell配置的脚本。
/etc/profile文件包含了>>执行/etc/profile.d/目录下的脚本
三、配置程序开启自启
手动安装rc-local.service服务
注意:在CentOS7之后可能无法自启动,CentOS7之后采用systemd作为init,rc.local也是通过systemd的service启动的。
在这些新发行版中,使用 systemctl enable rc-local.service 命令可以启用 rc-local.service 服务,其作用如下:
-
启用 rc-local 功能:这将允许你在 /etc/rc.d/rc.local 文件中编写自定义命令或脚本,并在系统启动时自动执行。简而言之,它还是保留了以前 rc.local 的功能,但通过 systemd 初始化系统来实现。
-
设置 rc-local.service 的自启动:通过使用 systemctl enable 命令,你告诉系统在引导期间自动启动 rc-local.service 服务。这样,你就无需手动执行 rc-local.service,系统会在每次启动时自动启动。
总的来说,启用 rc-local.service 服务的作用是让你可以使用类似于以前 rc.local 的方式,在系统启动时执行自定义的命令或脚本。然而,这也取决于你的 Linux 发行版和版本,因为有些发行版可能已经移除了或不再默认安装 rc-local.service 服务。
说明:systemd 默认会读取 /etc/systemd/system 下的配置文件,该目录下的文件会链接 /lib/systemd/system/ 下的文件。一般系统安装完 /lib/systemd/system/ 下会有 rc-local.service 文件,即我们需要的配置文件。
1、配置rc-local.service软链接
将 /lib/systemd/system/rc-local.service 链接到 /etc/systemd/system/ 目录下面来
ln -s /lib/systemd/system/rc-local.service /etc/systemd/system/rc-local.service
2、修改rc-local.service配置
在 /etc/systemd/system/rc-local.service 文件添加如下一行(如不存在)
[Install]
WantedBy=multi-user.target
Alias=rc-local.service
3、配置/etc/rc.local软链接(若不存在)
注意:与linux发行版有关,有的系统rc.local就是在/etc/下的,我的是在/etc/rc.d/rc.local下
ln -s /etc/rc.d/rc.local /etc/rc.lcal
4、修改启动脚本执行内容
在 /etc/rc.d/rc.local 或者其链接文件 /etc/rc.local 文件中添加启动命令
# 启动基础服务
sudo /usr/local/nginx/sbin/nginx
sudo /opt/redis/bin/redis-server /opt/redis/redis.conf
# 启动jar守护进程脚本
nohup /data/script/check_and_start_jars.sh > /data/script/check.log 2>&1 &
5、添加可执行权限
chmod +x /etc/rc.local
chmod +x /etc/rc.d/rc.local
6、激活rc-local.service
systemctl enable rc-local.service //设置开机启动
systemctl disable rc-local.service //取消开机启动
systemctl start rc-local.service //启动rc-local.service
systemctl restart rc-local.service //重启rc-local.service
systemctl stop rc-local.service //停止rc-local.service
systemctl status rc-local.service //查看rc-local.service状态
7、其它相关命令
firewall-cmd -state //查看防火墙开启状态
systemctl status firewalld //查看防火墙服务状态
systemctl enable firewalld //设置开机启动防火墙
systemctl disable firewalld //设置开机禁用防火墙
journalctl -u test.service //查看service日志,journalctl用于查看系统日志,-u指定服务名称。
systemctl daemon-reload //重新加载systemd守护程序,以便它可以读取任何新的或更改的服务文件。
ps auxw --sort=-rss //查看内存占用情况,列出所有进程,并按内存使用量从高到低排序。
df -h //查看磁盘占用情况
du -sh * //查看当前目录文件大小
四、配置Java程序守护进程
编写守护进程脚本
vi /data/script/check_and_start_jars.sh
#!/bin/bash
# 生效自启程序所需的环境变量脚本
source /etc/profile.d/run_env.sh
source /etc/profile.d/nssp_env.sh
# 定义jar文件列表
JAR_NAMES=("myapp1.jar" "myapp2.jar" "myapp3.jar")
# 定义拉起jar的命令
JAR_SH=("app1.sh" "app2.sh" "app3.sh")
# 获取数组的长度
length=${#JAR_NAMES[@]}
while :
do
# 循环检查每个jar文件是否正在运行
for ((i=0; i<$length; i++))
do
JAR_NAME=${JAR_NAMES[$i]}
pid=$(ps -ef | grep ${JAR_NAME} | grep -v grep | awk '{print $2}')
# 判断pid是否为空,即表示进程不存在
if [ -z "${pid}" ]; then
echo "${JAR_NAME} was shutdown."
sh /data/script/app/${JAR_SH[$i]} start
else
echo "${JAR_NAME} is running."
fi
done
# 每隔1分钟检查一次进程状态
sleep 1m
done
exit 0
exit 0 :正常运行程序并退出程序。
exit 1 :非正常运行导致退出程序,也可以是其他数字。
在启动jar包时手动指定JDK路径
nohup /usr/local/jdk1.8/bin/java -jar app1.jar > /data/app1/run.log 2>&1 &
给予执行权限
chmod +x check_and_start_jars.sh
后台运行脚本
nohup /data/script/check_and_start_jars.sh > /dev/null 2>&1 &
查杀运行脚本
ps -aux | grep check_and_start_jars.sh
kill -9 $(ps -ef | grep "check_and_start_jars.sh" | grep -v grep | awk '{print $2}')
五、配置自定义服务
无法读取环境变量
将Java程序配置为系统服务(systemd服务)来实现开机自启动。使用systemd可以很方便地管理和控制后台服务,包括Java程序。与rc-local.service相同原理。
以下是一个简单的步骤来配置Java程序为systemd服务:
1、编写启动脚本
vi /data/script/start.sh
#!/bin/bash
# 配置对应的JDK环境变量
export JAVA_HOME=/usr/local/jdk1.8
export CLASSPATH=.:$JAVA_HOME/lib
export PATH=$JAVA_HOME/bin:$PATH
# jar包路径
JAR_PATH=/data/app/test.jar
# 启动Java程序
nohup java -jar $JAR_PATH > /data/app/run.log 2>&1 &
2、添加可执行权限
chmod +x /data/script/start.sh
3、创建systemd服务单元文件
在/etc/systemd/system/目录下创建一个以.service结尾的文件test.service,用于定义您的Java程序作为systemd服务的配置。
[Unit]
Description=Your Java Program
After=network.target
[Service]
ExecStart=/data/script/start.sh
Type=simple
Restart=on-failure
[Install]
WantedBy=multi-user.target
4、激活test.service服务
systemctl enable test.service
六、chkconfig命令
无法读取环境变量
1、首先编写好自启的脚本
/etc/init.d/test.sh
#!/bin/sh
# chkconfig: 2345 10 90
# 创建个文件
touch /opt/script/1.txt
2、添加可执行权限
chmod +x test.sh
3、将脚本添加到开机启动项
chkconfig --add test.sh
4、将脚本设置为自启动
chkconfig test.sh on
5、chkconfig命令的常用参数
chkconfig --list:列出所有系统服务的启动状态;
chkconfig --add:增加服务;
chkconfig --del:删除服务;
chkconfig 服务名 on:设定服务开机启动;
chkconfig 服务名 off:关闭服务开机启动;
chkconfig 服务名 --level 35 on:设定服务在等级3和等级5时启动;
chkconfig 服务名 --level 35 off:关闭服务在等级3和等级5时自动启动;
chkconfig --level 35 服务名 on:设定服务在等级3和等级5时启动;
chkconfig --level 35 服务名 off:关闭服务在等级3和等级5时自动启动;
七、配置计划任务
无法读取环境变量
可以周期性执行某些任务,如:清理日志、备份数据、检查服务运行状态...
安装crontabs
yum install contabs
编辑当前用户的crontab文件,添加计划任务
crontab -e
# 每分钟执行1次command
* * * * * /data/check_and_start_jars.sh > /dev/null 2>&1 &
点击查看代码
# 每分钟执行1次command
* * * * * command
# 每小时执行1次command
0 * * * * command
# 每天执行1次command
0 0 * * * command
# 每周执行1次command
0 0 * * 0 command
# 每月执行1次command
0 0 1 * * command
# 每月最后1天执行1次command
0 0 L * * command
# 每年1月1日执行1次command
0 0 1 1 * command
# 每2小时执行1次command
0 */2 * * * command
# 每天7:50执行1次command
50 7 * * * command
# 每月1号和15号执行1次command
0 0 1,15 * * command
# 每小时的第1分执行1次command
1 * * * * command
# 每小时的第3和第15分钟执行1次command
3,15 * * * * command
# 在上午8点到11点的第3和第15分钟执行1次command
3,15 8-11 * * * command
# 每隔2天的上午8点到11点的第3和第15分钟执行1次command
3,15 8-11 */2 * * command
# 每月1、10、22日的4 : 45执行1次command
45 4 1,10,22 * * command
# 每周六、周日的1:10执行1次command
10 1 * * 6,0 command
# 每天18 : 00至23 : 00之间每隔30分钟执行1次command
0,30 18-23 * * * command
查看当前用户的 crontab 文件
crontab -l
删除当前用户的 crontab 文件
crontab -r
查看crontab的日志信息
tail -f /var/log/cron
激活
systemctl enable crond
启动
systemctl start crond
状态
service crond status

浙公网安备 33010602011771号