启动、登录、注销时执行Linux脚本
问题
启动 Linux 系统并登录的过程中到底发生了什么事情,按下开机键或启动一个虚拟机,你就启动了一系列事件,之后会进入到一个功能完备的系统中,当你注销或者关机时,也是这样。更有意思的是,在系统启动以及用户登录或注销时,还可以让系统执行特定的操作。
注意:我们假定使用的是 Bash 作为登录及注销的主 Shell。如果你使用的是其他 Shell,那么有些方法可能会无效
启动时执行linux脚本
1、使用cron任务
除了常用格式(分 / 时 / 日 / 月 / 周)外,cron 调度器还支持 @reboot
指令。这个指令后面的参数是脚本(启动时要执行的那个脚本)的绝对路径。
然而,这种方法需要注意两点:
- a) cron 守护进程必须处于运行状态(通常情况下都会运行)
- b) 脚本或 crontab 文件必须包含需要的环境变量(如果有的话)
我们可以通过 crontab -e
来设置
$ crontab -e
@reboot /home/alvin/auto_run_script.sh
2、使用/etc/rc.d/rc.local
Linux在启动时,会自动执行/etc/rc.d目录下的初始化程序,因此我们可以把启动任务放到该目录下,/etc/rc.d/目录下的初始化程序很多,rc.local是在完成所有初始化之后执行的,所以在这里做手脚很合适。
init.d目录下都为可执行程序,他们其实是服务脚本,按照一定格式编写,Linux 在启动时会自动执行,类似Windows下的服务。
对于 systemd-based 发行版 Linux 同样有效。不过,使用这个方法,需要授予 /etc/rc.d/rc.local
文件执行权限。
$ vim auto_run_script.sh
#!/bin/bash
date >> /home/alvin/output.txt
hostname >> /home/alvin/output.txt
$ vim /etc/rc.d/rc.local
/home/alvin/auto_run_script.sh
3、使用systemd 服务
本方法仅适用于 systemd 系统。如何区分是不是 systemd 系统?很简单,只需运行 ps aux
命令,查看 pid 为 1 的进程是不是 systemd
我们需要创建一个 systemd 启动服务,并把它放置在 /etc/systemd/system/
目录下
我们创建的 systemd 启动服务如下。请注意,这时后缀是 .service
,而不是 .sh
$ vim auto_run_script.service
[Unit]
Description=Run a Custom Script at Startup
After=default.target
[Service]
ExecStart=/home/alvin/auto_run_script.sh
[Install]
WantedBy=default.target
从服务的内容可以看出来,我们最终还是会调用 /home/alvin/auto_run_script.sh 这个脚本。
然后,我们再把这个脚本放置在 /etc/systemd/systerm/
目录下,之后我们再运行下面两条命令来更新 systemd 配置文件,并启动服务。
$ systemctl daemon-reload
$ systemctl enable auto_run_script.service
登录或注销时执行linux脚本
1、分别使用~.bash_profile
和~.bash_logout
文件,在每个文件的底部,添加调用的脚本代码
2、在/etc/profile.d/
目录下新建sh脚本,/etc/profile
会遍历/etc/profile.d/*.sh
示例:
vi .bash_profile
/home/es/auto_run_script.sh
vi auto_run_script.sh
#!/bin/bash
date >> /home/es/output.txt
hostname >> /home/es/output.txt
nohup /home/es/elk/es/es1/bin/elasticsearch > /home/es/elk/es/es1/nohup.out 2>&1 &
nohup /home/es/elk/es/es2/bin/elasticsearch > /home/es/elk/es/es2/nohup.out 2>&1 &
nohup /home/es/elk/es/es3/bin/elasticsearch > /home/es/elk/es/es3/nohup.out 2>&1 &
nohup /home/es/elk/kibana/kibana-7.10.1-linux-x86_64/bin/kibana > /home/es/elk/kibana/kibana-7.10.1-linux-x86_64/nohup.out 2>&1 &
几个脚本的区别
(1) /etc/profile:
此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行. 并从/etc/profile.d目录的配置文件中搜集shell的设置。
(2) /etc/bashrc:
为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取(即每次新开一个终端,都会执行bashrc)。
(3) ~/.bash_profile:
每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次。默认情况下,设置一些环境变量,执行用户的.bashrc文件。
(4) ~/.bashrc:
该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。
(5) ~/.bash_logout:
当每次退出系统(退出bash shell)时,执行该文件. 另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承 /etc/profile中的变量,他们是”父子”关系。
(6) ~/.bash_profile:
是交互式、login 方式进入 bash 运行的
(7) ~/.bashrc:
是交互式 non-login 方式进入 bash 运行的通常二者设置大致相同,所以通常前者会调用后者。
参考链接
https://linux.cn/article-8286-1.html
https://blog.csdn.net/kexuanxiu1163/article/details/107437981