1 引言

掌握Ubuntu中创建和运行shell 脚本的方法。

2 Window中的批处理文件

2.1 基础知识

        Windows批处理文件(Batch File)是一种脚本文件,通常以.bat或.cmd为扩展名。它们是用于Microsoft Windows操作系统的一系列命令的集合,这些命令可以顺序执行来完成特定的任务。批处理文件可以在命令提示符(Command Prompt)环境中运行,并且可以包含诸如内部命令、外部命令和实用工具等。批处理文件通常用于自动化重复的任务,例如备份文件、运行程序、管理用户账户等。

2.2 创建批处理文件

1.打开记事本:

在 Windows 中,按 Win + R 打开“运行”对话框。

输入 notepad 并按回车,打开记事本。

2.编写命令:

在记事本中输入你想要执行的命令。每行一个命令,例如:

@echo off

echo Hello, World!

dir

pause

其中:

@echo off 用于关闭命令回显,这样在执行时不会显示每条命令本身。

echo Hello, World! 用于在命令行输出文本。

dir 列出当前目录的内容。

pause 会暂停批处理文件的执行,并显示“请按任意键继续...”,等待用户按键。

3/保存文件:

点击“文件”菜单,选择“另存为”。

在“文件名”框中输入文件名,但确保文件扩展名为 .bat,例如 example.bat。

选择一个保存位置,例如桌面或者C盘根目录,然后点击“保存”。

4.运行批处理文件:

导航到保存批处理文件的目录。

双击 .bat 文件,或者在命令提示符下输入文件的完整路径并按回车。

3 shell 脚本

3.1 基础知识

shell 是一个命令行解释器, 负责接收和解析用户通过终端输入的命令。

每当用户在终端中输入一条命令,shell 会立即将其 "翻译" 成操作系统可以理解的指令。

终端是一个提供命令输入和输出环境的程序,可以把它看作是一个窗口,让用户可以看到系统的反馈。

而 shell 则是这个窗口中的工具,帮助用户向操作系统发出指令。

3.2 编辑Shell脚本

shell脚本通常由一系列Shell命令组成。

.sh文件就是Shell脚本文件。输入下列命令,编辑脚本文件:

vim shelltest.sh

在vim中输入:

点击i键进入编辑模式

#!/bin/bash

while true

do

        echo $(date +"%F %T") >> time.txt

        sleep 3

done    

Esc键退出编辑模式

:wq保存并退出

这一段shell脚本的作用是每隔3秒钟,把当前日期写入time.txt中,其中,

 #!/bin/bash 是脚本的头文件声明,指定使用 bash 解释器来执行后续的脚本代码

3.3 前台运行Shell脚本

在前台运行Shell脚本时,我们会一直等待直到脚本运行结束,或者使用Ctrl+C键结束脚本运行。

方法一:通过 bash 解释器来执行

输入下列命令,通过 bash 解释器在前台运行shell脚本。

bash shelltest.sh

可以发现该脚本一直在循环输出。

可以使用Ctrl+C键结束这个命令。

输入下列命令。

ls

可以看到多出来一个time.txt文件。输入下列命令,查看文件信息。

cat time.txt

可以看到这个脚本被正常运行了。

方法二:直接运行脚本

输入下列命令,直接在前台运行shell脚本。

./shelltest.sh

提示说这个文件没有执行权限。

输入下列命令,赋予该文件执行权限。

chmod u+x shelltest.sh

然后重新输入

./shelltest.sh

可以使用Ctrl+C键结束这个命令。输入下列命令,查看文件信息。

cat time.txt

可以看到这个脚本被正常运行了。

3.4 后台运行Shell脚本

对比:在前台运行Shell脚本时,我们会一直等待直到脚本运行结束,或者使用Ctrl+C键结束脚本运行。在后台运行Shell脚本时,脚本在后台运行,我们无需一直等待。

第一种方法:加“&”符号

如果想让程序在后台运行,执行程序的时候,命令的最后面加“&”符号。

# 执行文件

./shelltest.sh &

# 查看是否在后台运行

ps -ef | grep shelltest

或者 ps -ef | grep shelltest.sh

脚本会在后台运行

我尝试使用关闭终端来终止程序运行,但是失败了

用kill语句终止命令  使用看到的PID

kill 7433

现在只剩grep的运行,这是grep 自己的进程,不是脚本,终止成功。

第二种方法:使用 nohup

nohup是一个允许在后台无挂起地运行命令的程序。nohup是“no hang up”的缩写,直译为“不挂断”,它可以在你退出帐户/关闭终端后继续运行相应的进程。

nohup ./shelltest.sh > run.log 2>&1 &

nohup:忽略挂起信号,关闭 SSH 也不停

> run.log:把输出写入 run.log 文件

2>&1:把错误输出也写入同一个文件

 &:放到后台运行

终止程序

kill 8417

cat time.txt

第三种方法:使用screen

先安装screen

sudo apt install screen

创建一个后台会话

screen -S test

进入后运行脚本

./shelltest.sh

退出但不停止

Ctrl + A + D

查看 screen

screen -ls

查看进程,还在运行

恢复会话

screen -r 10580.test

(看自己的程序的进程id)

还有一种方法是在

screen -S test

./shelltest.sh

之后输入screen -d或者exit来退出当前窗口

但是需要sh文件结束后才能起效,现在写的shelltest是持续的不会结束所以这里没用

screen -d 是保留当前窗口

exit 是退出程序,并关闭窗口

第四种方法:使用systemd服务

查看脚本所在目录

realpath shelltest.sh

创建服务文件

sudo nano /etc/systemd/system/shelltest.service

填入(把路径替换成实际脚本路径):

[Unit]

Description=Shell Test Script

After=network.target

[Service]

Type=simple

ExecStart=/bin/bash /home/zstuxsj/Desktop/shelltest.sh

WorkingDirectory=/home/zstuxsj/Desktop

Restart=on-failure

RestartSec=3

[Install]

WantedBy=multi-user.target

Description=:服务说明,写什么都行,建议写得你自己看得懂

After=network.target:表示网络起来后再启动。脚本不依赖网络也可以保留,没坏处。

ExecStart这里填“怎么启动你的脚本”

WorkingDirectory这里填“脚本运行时的工作目录”

保存并退出:Ctrl + O      Enter     Ctrl + X

启用并启动

sudo systemctl daemon-reload

sudo systemctl enable --now shelltest.service

看状态与日志

systemctl status shelltest.service

journalctl -u shelltest.service -f

停止

sudo systemctl stop shelltest.service

取消开机自启动

sudo systemctl disable shelltest.service

4 扩展知识:K8S和docker

K8S:

https://www.bilibili.com/video/BV1Du4m137pK?spm_id_from=333.788.videopod.sections&vd_source=1be27cbe131b9c3024ff27667bbda481

 

docker:

https://www.bilibili.com/video/BV1aA4m1w7Ew?spm_id_from=333.788.videopod.sections&vd_source=1be27cbe131b9c3024ff27667bbda481

更多推荐