Shell Script—线程

2023-11-08

本文主要介绍shell中的线程、线程中的等待和信号;

1.线程

Shell中线程的实现有多种方式,目前只介绍通过&符号;通过在命令末尾加上&符号,可以在后台启动一个进程并立即返回,允许Shell进程继续执行其他命令;

示例

#!/bin/bash

NUM=20

function fun1()
{
	for ((i=0;i<${NUM};i++));do
		echo -n "fun1"   #-n不换行输出
	done
}

function fun2()
{
	for ((i=0;i<${NUM};i++));do
		echo -n "fun2"
	done
}

function fun3()
{
	for ((i=0;i<${NUM};i++));do
		echo -n "fun3"
	done
}

function fun4()
{
	for ((i=0;i<${NUM};i++));do
		echo -n "fun4"
	done
}

#换行
fun1 &
fun2 &
fun3 &
fun4 &

#不换行也可以
#fun1 & fun2 & fun3 & fun4

#sleep 0.001   #等待0.001秒
sleep 1   #等待1秒
echo -e "\n"

输出

fun1fun1fun1fun1fun1fun1fun1fun1fun1fun1fun1fun1fun2fun1fun1fun2fun1fun2fun1fun1fun2fun1fun2fun1fun2fun1fun2fun2fun2fun2fun2fun2fun2fun2fun2fun2fun2fun2fun2fun2fun4fun4fun4fun4fun4fun4fun4fun4fun4fun4fun4fun4fun4fun4fun4fun4fun4fun4fun3fun4fun4fun3fun3fun3fun3fun3fun3fun3fun3fun3fun3fun3fun3fun3fun3fun3fun3fun3fun3fun3

在示例中定义了4个函数,fun1、fun2、fun3和fun4,在每个函数中不换行进行循环打印;

2.等待

在Shell中,可以使用不同的方法来实现等待操作,具体取决于你希望在等待期间执行的任务或条件。

2.1 sleep命令

sleep 命令:sleep 命令可用于暂停Shell脚本的执行一段指定的时间。它使用以下语法:

sleep <duration>

其中 <duration> 可以是具体的时间(以秒为单位),你可以直接指定要暂停的秒数,例如 sleep 5 表示暂停执行 5 秒;

除了秒,sleep 命令还支持在数字后面使用单位来指定其他时间单位,常用的时间单位包括:

  • s:秒(默认单位)
  • m:分钟
  • h:小时
  • d:天

你可以根据需要指定不同单位来实现更精确的时间间隔。以下是示例:

sleep 0.01    # 暂停执行 0.01 秒

sleep 30s    # 暂停执行 30 秒

sleep 2m     # 暂停执行 2 分钟

sleep 1h     # 暂停执行 1 小时

sleep 3d     # 暂停执行 3 天

这样,你就可以使用适当的单位根据需求指定 sleep 命令的时间间隔。

2.2 循环等待

可以使用一个循环来持续检查某个条件,直到条件满足为止。例如:

while [ ! -f /path/to/file ]
do
    sleep 1
done

2.3 信号处理

使用 trap 命令可以指定在接收到指定信号时执行某些命令。你可以使用信号来触发等待操作;

示例

#!/bin/bash

#通过信号来进行线程的等待
trap "continue_script=1" SIGUSR1  # 定义一个自定义信号的处理函数
continue_script=0  # 用于控制脚本是否继续执行

echo "begin"
# 在需要等待的地方检查条件
while [ $continue_script -eq 0 ]
do
        echo "$continue_script"
        sleep 1
done

echo "end"

执行kill -SIGUSR1 2059,其中2059为进程号,可以通过ps -ef | grep *.sh | grep -v grep 进行查看进程号;

输出

begin
0
0
0
0
0
0
end

在示例中定义了一个while循环,循环条件为$continue_script -eq 0,当向SIGUSR1发送信号时,$continue_script 值变为1,终止循环条件;

3.信号

在Shell中,有许多不同的信号,下面列出了一些常见的信号以及它们的含义:

  1. SIGINT(2):由终端发送的中断信号,例如使用Ctrl+C时。
  2. SIGQUIT(3):由终端发送的退出信号,例如使用Ctrl+\时。
  3. SIGKILL(9):无法捕获或忽略的强制终止信号。
  4. SIGTERM(15):默认的终止信号,用于正常终止进程。
  5. SIGHUP(1):终端连接断开的信号,通常用于通知进程重新加载配置文件。
  6. SIGUSR1(10)和 SIGUSR2(12):用户自定义信号,可用于自定义操作。
  7. SIGSTOP(19)和 SIGTSTP(20):用于停止进程的信号,例如使用Ctrl+Z时。
  8. SIGCONT(18):继续执行被停止的进程的信号。
  9. SIGPIPE(13):写入已关闭的管道时触发的信号。
  10. SIGCHLD(17):子进程结束或停止时发送给父进程的信号。

这只是一些常见的信号,不同的操作系统和Shell可能还会有其他信号。你可以使用kill -l命令来查看系统上可用的信号列表及其对应的编号;

使用trap命令来注册信号处理器,自定义在接收到特定信号时要执行的操作;

示例SIGINT

#!/bin/bash

cond=0
function fun()
{
	echo "echo get sigint, will finished!"
	cond=1
}

trap fun SIGINT

while [ ${cond} -eq 0 ];do
	sleep 1
done

执行脚本之后,ctrl+c会触发

输出

echo get sigint, will finished!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Shell Script—线程 的相关文章

随机推荐

  • Python 第三方模块 科学计算 Quantecon模块

    参见 https quantecon org quantecon py 一 简介 1 功能 quanrecon是1个用于计量经济学的高性能开源第3方Python模块 其中包含博弈论 马尔科夫链 优化 随机样本生成等工具 2 使用 1 安装
  • less background-image

    bg image url background image url url 2x png media webkit min device pixel ratio 3 min device pixel ratio 3 background i
  • Vue2国际化(i18n)

    一 安装 安装i18n插件 npm i vue i18n 二 配置 创建文件夹及文件 在src目录下创建lang文件夹 在lang文件夹下新建zh js和en js 分别存放中文和英文语言包 使用export default向外暴露 zh
  • Zotero学习

    看到几个很好的教程 帮助很大 做个备忘 B站 Zotero快速入门 链接 link Zotero基础操作 比Endnote更好用的文献管理软件 链接 link 知乎 Zotero SciHub 青柠学术 链接 link 搭建属于自己的文献数
  • Java API在HDFS上实现文件的上传、下载到本地、创建文件夹、删除文件和重命名文件

    前期准备 一 前期准备 1 Hadoop集群已配置完毕 2 linux系统安装jdk 3 在linux系统中安装并破解IntelliJ IDEA 二 通过JAVA API接口操纵HDFS 1 在IDEA中创建maven项目 2 设置配置文件
  • 大比拼:讯飞星火大模型将超越ChatGPT?

    5月6日 讯飞星火认知大模型成果发布会于合肥举办 会上 备受业界期待的 星火 认知大模型正式发布 讯飞AI学习机 讯飞听见 讯飞智能办公本 讯飞智慧驾舱 讯飞数字员工 四大行业中的五大成果同步演示 发布会全程进行实机展示 引发业界热烈反响
  • 查看Linux内核版本的命令

    方法一 命令 uname a 作用 查看系统内核版本号及系统名称 方法二 命令 cat proc version 作用 查看目录 proc 下version的信息 也可以得到当前系统的内核版本号及系统名称 补充说明 proc文件系统 它不是
  • wazhu架构搭建 小结

    基本的搭建步骤都在这个博客下 https www cnblogs com backlion p 10394369 html 下面写一些我再安装过程中遇到的问题 1 首先安装wazuh中的各个版本都需要一致 例如我安装的是 wazuh man
  • android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context

    问题描述 FATAL EXCEPTION main Process com wuchen juexiao mvvm PID 11732 android util AndroidRuntimeException Calling startAc
  • Linux基础服务11——LNMP架构

    文章目录 一 环境说明 二 安装nginx 三 安装mysql 四 安装php 五 配置nginx 六 配置php 七 验证 一 环境说明 主机 服务 192 168 161 129 nginx 192 168 161 131 mysql
  • Vagrant 扩大磁盘根目录(图文详解)

    Vagrant 扩大磁盘根目录 图文详解 实验环境 root centos72 cat etc redhat release CentOS Linux release 7 2 1511 Core root centos72 uname a
  • 【我的第一千篇文章】

    作为一名Java开发者 我很自豪地宣布 这里是我输出的第一千篇文章 在过去的六年里 我一直坚持每月输出优质内容 并将其分享给了全世界的读者们 这一千篇文章中 有很多关于Java编程的技巧 经验分享 优秀实践示例 案例分析等等 每篇文章都代表
  • 决策树分析例题经典案例_一级造价师考试——工程造价案例分析之2.3决策树分析法在方案评价中的应用...

    一级造价师考试 工程造价案例分析之2 3决策树分析法在方案评价中的应用 决策树分析方法一般会和资金时间价值综合起来进行考核 要会正确绘制决策树 根据资金时间价值计算各机会点的期望值 进行方案选择和决策 1 决策树的概念 决策树是以方框 和圆
  • Maven 命令

    输出依赖树 mvn dependency tree 输出依赖树到指定文件 mvn dependency tree gt tree txt 输出lib mvn dependency copy dependencies DoutputDirec
  • 如何将爬虫的数据添加到mysql数据库中

    以爬取糗事百科中24小时网页中第一列表页中所有文章的内容 作者 搞笑数 评论数为例 将爬取的四项内容存入到mysql数据库中 思路 要想存入到数据库中就需要用到数据库中的表 所以我们首先创建一个名叫 myblog 的数据库 然后在此数据库中
  • PHP 的Laravel 框架

    在windows下 搭建PHP的Laravel框架很简单 先把PHP的安装目录 加入到环境变量里 在命令行能访问到php v 就说明可以了 然后 这些是需求的环境 PHP gt 7 1 3 不用说了 OpenSSL PHP扩展 用compo
  • 51单片机编写60秒倒计时程序

    include
  • linux下mysql安装

    一 解压缩mysql 5 6 4 m7 tar zip 1 gt unzip mysql 5 6 4 m7 tar zip 会生成mysql 5 6 4 m7 tar gz的压缩文件 2 gt tar zxvf mysql 5 6 4 m7
  • mysqlbinlog命令使用

    参考 https www cnblogs com zouhong p 14540380 html https www iteye com blog wx1568934009 2469938 获取二进制日志列表show binary logs
  • Shell Script—线程

    本文主要介绍shell中的线程 线程中的等待和信号 1 线程 Shell中线程的实现有多种方式 目前只介绍通过 符号 通过在命令末尾加上 符号 可以在后台启动一个进程并立即返回 允许Shell进程继续执行其他命令 示例 bin bash N