创建和运行shell 脚本
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
更多推荐


所有评论(0)