Linux shell 控制脚本
一、信号
shell会将信号传给shell脚本程序来处理。而shell脚本的默认行为是忽略这些信号。它们可能会不利于脚本的运行。要避免这种情况,你可以脚本中加入识别信号的代码,并执行命令来处理信号。
Ctrl+C组合键会生成SIGINT信号(中断进程),并将其发送给当前在shell中运行的所有进程。
Ctrl+Z组合键会生成一个SIGTSTP信号,停止shel 中运行的任何进程。停止(stopping)进程跟终止(terminating)进程不同:停止进程会让程序继续保留在内存中,并能从上次停止的位置继续运行。
在第一个sleep 100后按Ctrl+C组合键,此时进程被中断。第二个sleep 100后按Ctrl+Z组合键,进程被暂停。
trap 命令允许你来指定shell脚本要监看并从shell中拦截的Linux信号。如果脚本收到了trap 命令中列出的信号,该信号不再由shell处理,而是交由本地处理。格式:
trap commands signals
例子:
#!/bin/bash
trap "echo ' Sorry! I have trapped Ctrl-C'" SIGINT
echo This is a test script
count=1
while [ $count -le 10 ]
do
echo "Loop #$count"
sleep 1
count=$[ $count + 1 ]
done
注释trap "echo ' Sorry! I have trapped Ctrl-C'" SIGINT 后:
除了在shell脚本中捕获信号,你也可以在shell脚本退出时进行捕获。要捕获shell脚本的退出,只要在trap命令后加上EXIT信号就行。
#!/bin/bash
trap "echo 'This is end'" EXIT
echo This is a test script
count=1
while [ $count -le 10 ]
do
echo "Loop #$count"
sleep 1
count=$[ $count + 1 ]
done
提前退出脚本也能捕获信号。
#!/bin/bash
trap "echo ' Sorry! I have trapped Ctrl-C'" SIGINT
count=1
while [ $count -le 5 ]
do
echo "Loop #$count"
sleep 1
count=$[ $count + 1 ]
done
trap "echo 'change trapped sign.'" SIGINT
count=1
while [ $count -le 5 ]
do
echo "changed,loop:$count"
sleep 1
((count++))
done
要删除已设置好的捕获,只需要在trap 命令与希望恢复默认行为的信号列表之间加上一个破折号就行。
#!/bin/bash
trap "echo ' Sorry! I have trapped Ctrl-C'" SIGINT
count=1
while [ $count -le 5 ]
do
echo "Loop #$count"
sleep 1
count=$[ $count + 1 ]
done
echo "Now remove trap sign."
trap - SIGINT
count=1
while [ $count -le 5 ]
do
echo "changed,loop:$count"
sleep 1
((count++))
done
二、后台运行脚本
要想在后台运行脚本,只需加上&:
#!/bin/bash
echo start running
for((i=1;i<=5;i++))
do
echo i=$i
sleep 1
done
echo end running
sh hou1.sh &的返回结果解释:
方括号里的数字是作业号,后面的数字是进程id。
当执行后台任务时,也会将输出显示在屏幕上。运行完后会显示作业号,作业状态,启功名称。如果关闭控制台,后台任务也会取消。要想在关闭控制台后后台任务继续运行可使用nohup。nohup命令运行了另外一个命令来阻断所有发送给该进程的SIGHUP信号。这会在退出终端会话时阻止进程退出。由于nohup命令会解除终端与进程的关联,进程也就不再同STDOUT和STDERR联系在一起。为了保存该命令产生的输出,nohup命令会自动将STDOUT和STDERR的消息重定向到一个名为nohup.out的文件中。
三、作业控制
启动、停止、终止以及恢复作业的这些功能统称为作业控制。
查看作业
jobs查看作业。
带加号的作业会被当做默认作业。当前的默认作业完成处理后,带减号的作业成为下一个默认作业。任何时候都只有一个带加号的作业和一个带减号的作业,不管shell中有多少个正在运行的作业。
使用-l列出进程id和作业号。
重启停止的作业
#!/bin/bash
file=testhou
if [ -e $file ]; then
cat /dev/null > $file
else
touch $file
fi
for((i=1;i<=5;i++))
do
echo i=$i >> $file
sleep 4
done
echo end running >> $file
用bg 作业号以后台模式重启作业:
用fg 作业号以前台模式重启作业:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具