启动、登录、注销时执行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

https://www.cnblogs.com/pengpengboshi/p/13556006.html