64、深入探索Bash脚本部署与自动化作业

深入探索Bash脚本部署与自动化作业

1. 部署Bash脚本

在文本文件中添加多个命令以运行时,必须在文件开头使用Shebang行( #! ),它用于指定要使用的Linux shell。同时,需要使用 chmod 命令的 u+x 选项为自己赋予执行该文件的权限。运行文件时,可能需要指定文件的完整路径,或者修改系统的 PATH 环境变量,以便shell能找到脚本文件。

Bash shell为脚本文件提供了额外功能,使其更像真正的程序:
- echo 语句 :可在脚本的命令输出之间插入文本输出,帮助修改脚本产生的输出。
- 变量
- 环境变量 :可获取脚本运行的shell环境信息,如启动shell的用户账户及其相关信息。
- 用户变量 :能在脚本中存储和检索数据,让脚本表现得像真正的程序。

Bash shell还提供了高级编程特性:
- 命令替换 :可将命令的输出捕获到变量中,以便在脚本中从命令输出中提取信息。
- 数学运算 :Bash shell支持基本的整数数学运算,但处理浮点数不太擅长,可能需要借助 bc 计算器等其他程序。
- 逻辑语句 :支持 if case 逻辑语句,可对数字、字符串和文件进行特定条件测试,并根据测试结果运行命令。
- 循环 :支持 for while 循环,可遍历数据组,在一组命令中处理每个元素。

2. 数据处理与访问
  • 数据处理方式
    • 输出重定向 :可将命令的输出重定向到文本文件,供后续读取。
    • 管道 :可将一个命令的输出重定向为另一个命令的输入数据,运行脚本时输出不会显示在监视器上,数据传输在后台进行。
  • 可访问的数据类型
    • 环境变量 :包含脚本运行的shell环境信息,可获取系统和运行脚本的用户账户信息。
    • 位置变量 :允许在运行脚本时从命令行向脚本传递数据。
3. 数据操作与数学运算
  • 数据操作 :命令替换可将命令输出重定向到用户变量,然后使用标准的Linux文本处理命令对数据进行排序、提取数据记录等操作,再将变量数据重定向到另一个命令。
  • 数学运算 :Bash shell使用 $[] 符号定义要处理的数学方程,但只能执行整数运算,功能有限。
4. 逻辑实现方法

Bash shell支持 if 语句和 case 语句,可对数值、字符串或文件进行测试,并根据测试结果运行一组命令。

5. 复习问题

以下是一些相关的复习问题及答案:
| 问题 | 选项 | 答案 |
| — | — | — |
| 用于定义shell脚本所用shell的Shebang由什么字符组成? | A. >>
B. #!
C. |
D. >
E. 2> | B |
| Henry要将脚本输出存储到新的日志文件中,应使用什么字符? | A. >>
B. #!
C. |
D. >
E. 2> | D |
| Jasmine创建了新的Bash脚本,要从命令行运行,应给文件分配什么 chmod 权限? | A. 644
B. u+r
C. u+x
D. u+w
E. u=wr | C |
| 哪个环境变量包含启动shell的用户的用户名? | A. $USER
B. $UID
C. $HOME
D. $BASH
E. $1 | A |
| Zuri编写Bash脚本,要给变量赋值,应怎么做? | A. var1=$(10)
B. var1 = 10
C. var1=10
D. var1="10"
E. var1= 10 ` | C | | Cameron编写Bash脚本,要测试文件是否存在且为普通文件,应写哪行代码? | A. if [ -e file ] <br> B. if [ -f file ] <br> C. if [ -d file ] <br> D. if [ -x file ] <br> E. if [ -w file ] | B | | 用什么字符或字符组合将一个命令的输出重定向到另一个命令? | A. >> <br> B. #! <br> C. | <br> D. > <br> E. 2> | C | | Christina创建Bash脚本,希望脚本失败时返回值为2,应添加什么语句? | A. #! <br> B. $? <br> C. $1 <br> D. exit <br> E. while | D | | 要执行命令替换,将命令输出赋值给脚本中的变量,应使用什么命令? | A. > <br> B. >> <br> C. $[] <br> D. | <br> E. $() | E | | 在脚本中执行数学运算,应使用什么命令? | A. > <br> B. >> <br> C. $[] <br> D. | <br> E. $()` | C |

6. 自动化作业

在构建shell脚本时,可能会思考如何在Linux系统上运行和控制它们。除了从命令行界面实时运行命令和脚本外,还有其他运行脚本的选项,同时也需要解决脚本陷入循环等问题。

6.1 后台运行脚本

有时直接从命令行界面运行shell脚本不太方便,因为有些脚本处理时间长,会占用命令行界面。可以将脚本在后台运行,方法是在命令后添加 & 符号,例如:

$ ./test1.sh &
[1] 19555
$ This is a test program
Loop #1
Loop #2

$ ls -l
total 8
-rwxr--r--    1 rich     rich          219 Feb  26 19:27 test1.sh
$ Loop #3

添加 & 符号后,命令与Bash shell分离,作为系统的后台进程运行。系统会显示作业号和进程ID(PID),之后会出现新的命令行界面提示符,可继续输入新命令。后台进程运行时仍会使用终端监视器输出消息,进程结束时会在终端显示状态信息。

也可以同时启动多个后台作业,每个作业会被分配唯一的作业号和PID。可以使用 ps 命令查看运行的进程,但如果所有进程都在终端会话中显示输出,会比较混乱。

需要注意的是,后台进程与终端会话绑定,如果终端会话退出,后台进程也会退出。有些终端模拟器会提醒,有些则不会。若希望脚本在注销控制台后仍在后台运行,可使用 nohup 命令。

6.2 无控制台运行脚本

使用 nohup 命令可让脚本在终端会话退出后继续在后台运行。 nohup 命令会阻止发送给进程的 SIGHUP 信号,防止进程在终端会话退出时终止。可将 nohup 命令与 & 符号结合使用,例如:

$ nohup ./test1.sh &
[1] 19831
$ nohup: appending output to  'nohup.out'
$

使用 nohup 命令后,脚本会忽略终端会话发送的 SIGHUP 信号。由于 nohup 命令将进程与终端分离,进程会失去与监视器的输出链接,输出消息会自动重定向到当前工作目录下的 nohup.out 文件。进程运行结束后,可查看该文件获取输出结果。

6.3 发送信号

Bash shell可向系统上运行的进程发送信号,用于停止或中断失控的应用程序进程。对于前台运行的应用程序,可使用键盘组合键生成两个基本的Linux信号:
- 中断进程 Ctrl+C 组合键生成 SIGINT 信号,可停止当前在shell中运行的进程,例如:

$ sleep 100

$
  • 暂停进程 Ctrl+Z 组合键生成 SIGTSTP 信号,可暂停shell中运行的进程。暂停进程与终止进程不同,暂停后程序仍在内存中,可继续运行。例如:
$ sleep 100

[1]+  Stopped                 sleep 100
$

若有停止的作业,尝试退出shell时Bash会发出警告。可使用 ps 命令查看停止的作业状态,若想退出shell并终止停止的作业,可再次输入 exit 命令,或使用 kill 命令发送 SIGKILL 信号终止作业。

另外, Ctrl+D 组合键会向shell的标准输入发送 EOF 字符,输入数据流时可用于指示数据结束。若不输入数据直接使用 Ctrl+D ,会导致shell终止,若是登录shell,会自动注销系统。

6.4 作业控制

使用 Ctrl+Z 组合键停止作业后,可对其进行杀死或重启操作,重启停止的进程需要发送 SIGCONT 信号。启动、停止、杀死和恢复作业的功能称为作业控制,可使用相关命令查看和控制shell中运行的作业。

查看作业 :关键命令是 jobs 命令,可查看shell当前处理的作业。例如:

$ cat test2.sh
#!/bin/bash
# testing job control

echo "This is a test program $$"
count=1
while [ $count -le 10 ] ; do
    echo "Loop #$count"
    sleep 10
    count=$[ $count + 1 ]
done
echo "This is the end of the test program"
$ ./test2.sh
This is a test program 29011
Loop #1

[1]+  Stopped                 ./test2.sh
$ ./test2.sh > test2.sh.out &
[2] 28861
$
$ jobs
[1]+  Stopped                 ./test2.sh
[2]-  Running                 ./test2/sh >test2.shout &
$

jobs 命令使用一些不同的命令行参数,如下表所示:
| 参数 | 描述 |
| — | — |
| -l | 列出进程的PID和作业号 |
| -n | 仅列出自上次shell通知后状态发生变化的作业 |
| -p | 仅列出作业的PID |
| -r | 仅列出正在运行的作业 |
| -s | 仅列出已停止的作业 |

作业输出中的 + 号表示默认作业,若作业控制命令未指定作业号,将引用该作业; - 号表示当前默认作业处理完成后将成为默认作业的作业。任何时候,shell中只有一个带 + 号和一个带 - 号的作业。

深入探索Bash脚本部署与自动化作业

7. 作业控制的深入理解

作业控制在Bash脚本的运行管理中起着至关重要的作用,它可以让我们更加灵活地掌控脚本的执行。

7.1 作业状态转换

作业在运行过程中会有不同的状态,如运行、停止、终止等。我们可以通过不同的操作来改变作业的状态。
- 运行到停止 :使用 Ctrl+Z 组合键可以将正在运行的作业暂停,使其进入停止状态。例如上述提到的 ./test2.sh 脚本,在运行过程中按下 Ctrl+Z ,脚本就会停止,系统会显示作业号和停止信息。
- 停止到运行 :要将停止的作业重新启动,可以使用 fg (前台运行)或 bg (后台运行)命令。例如,若要将作业号为 1 的停止作业在前台运行,可以输入 fg 1 ;若要在后台运行,则输入 bg 1
- 作业的终止 :可以使用 kill 命令向作业发送信号来终止作业。如前面提到的 kill -9 20605 ,就是向PID为 20605 的作业发送 SIGKILL 信号,强制终止该作业。

7.2 作业控制的流程图
graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px

    A([开始运行作业]):::startend --> B(作业运行中):::process
    B --> C{是否需要暂停?}:::decision
    C -->|是| D(按下Ctrl+Z):::process
    D --> E(作业停止):::process
    E --> F{是否继续运行?}:::decision
    F -->|是| G{前台还是后台?}:::decision
    G -->|前台| H(fg 作业号):::process
    G -->|后台| I(bg 作业号):::process
    H --> B
    I --> B
    C -->|否| J{是否需要终止?}:::decision
    J -->|是| K(kill -信号 作业PID):::process
    K --> L([作业终止]):::startend
    J -->|否| B
    F -->|否| L
8. 脚本运行的优化策略

在实际使用中,为了提高脚本的运行效率和稳定性,我们可以采取一些优化策略。

8.1 资源管理
  • 内存管理 :Bash脚本在运行过程中会占用一定的内存资源。对于一些大型脚本或需要处理大量数据的脚本,要注意内存的使用情况。可以通过优化变量的使用、避免不必要的循环和递归等方式来减少内存的占用。
  • CPU使用 :如果脚本中有一些耗时的操作,如大量的数学运算或文件处理,可以考虑将这些操作放在后台运行,避免占用过多的CPU资源,影响其他任务的执行。
8.2 错误处理

在脚本中添加错误处理机制可以提高脚本的稳定性。例如,使用 set -e 命令可以让脚本在遇到错误时立即终止,避免错误继续传播。同时,可以使用 try-catch 类似的结构来捕获和处理特定的错误。以下是一个简单的示例:

#!/bin/bash
set -e
function main() {
    # 尝试执行命令
    command_that_might_fail
    echo "命令执行成功"
}
# 捕获错误
main || {
    echo "命令执行失败,进行错误处理"
    # 可以在这里添加具体的错误处理逻辑
}
9. 脚本的监控与日志记录

为了更好地了解脚本的运行情况,我们可以对脚本进行监控并记录日志。

9.1 监控脚本的运行状态

可以使用 ps 命令和 top 命令来监控脚本的运行状态。 ps 命令可以查看系统中所有进程的信息,通过过滤可以查看特定脚本的运行情况。 top 命令可以实时显示系统中各个进程的资源使用情况,方便我们及时发现脚本是否存在异常。

9.2 日志记录

日志记录可以帮助我们追踪脚本的运行过程,便于排查问题。可以使用 echo 命令将关键信息输出到日志文件中。例如:

#!/bin/bash
log_file="script.log"
echo "脚本开始运行" >> $log_file
# 脚本的主要逻辑
for i in {1..10}; do
    echo "循环第 $i 次" >> $log_file
    sleep 1
done
echo "脚本运行结束" >> $log_file

这样,脚本的运行过程就会被记录在 script.log 文件中,方便后续查看和分析。

10. 总结

通过以上对Bash脚本部署与自动化作业的深入探讨,我们了解了脚本的编写、运行、控制和优化等方面的知识。从脚本的基本部署,包括Shebang行的使用、权限设置,到数据处理、逻辑实现等高级编程特性;从脚本的不同运行模式,如后台运行、无控制台运行,到作业控制、信号发送等管理手段;再到脚本运行的优化策略和监控日志记录,这些知识可以帮助我们更加高效、稳定地使用Bash脚本,提高工作效率,解决实际问题。在实际应用中,我们可以根据具体的需求和场景,灵活运用这些知识,让Bash脚本发挥更大的作用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值