深入探索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脚本发挥更大的作用。
超级会员免费看

被折叠的 条评论
为什么被折叠?



