shell向子进程发送信号
时间:2019-09-29
本文章向大家介绍shell向子进程发送信号,主要包括shell向子进程发送信号使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
处理包含子进程的脚本,假设您希望终止任意子进程,那么还需要停止这些脚本。trap
命令完成此操作。
子进程
以 &
运行的子进程,最为后台程序运行,父进程与子进程之间为异步
已直接方式运行子进程,此时子进程在前台运行,父进程与子进程之间为同步
sleep 10 #等待10秒,再继续下一操作
sleep 10 & #当前shell不等待,后台子shell等待
trap
Unix system by design doesn’t allow any script/program to trap SIGKILL due to security reasons.
Setting a trap for SIGKILL or SIGSTOP produces undefined results.
trap
捕捉到信号之后三种处理方式
- 执行一段代码来处理信号
trap "commands" signal-list
ortrap 'commands' signal-list
- 接受信号的默认操作,即恢复信号默认操作
trap signal-list
- 忽视信号
trap "" signal-list
注意事项:
SIGKILL
SIGSTOP
SIGSEGV
SIGCONT
不设置捕捉- 在捕捉到signal-list中指定的信号并执行完相应的命令之后, 如果这些命令没有将shell程序终止的话,shell程序将继续执行收到信号时所执行的命令后面的命令,这样将很容易导致shell程序无法终止。
- 在trap语句中,单引号和双引号是不同的,当shell程序第一次碰到trap语句时,将把commands中的命令扫描一遍。此时若commands是用单引号括起来的话,那么shell不会对commands中的变量和命令进行替换
Example
全部使用同步方式
#!/bin/bash
# trapchild
trap 'echo "[TRAP]I am going down, so killing off my processes.."; ps -a | grep sleep | xargs kill -9; wait; exit' SIGHUP SIGINT SIGQUIT SIGTERM SIGKILL
./a.sh
err=$?
if [ $err != 0 ]; then
echo 3 $err
exit 1
fi
echo "[TRAP]my process pid is: $$"
echo "[TRAP]my child pid list is: $pid"
wait
#!/bin/bash
# trapchild
trap 'echo "[a]ash I am going down, so killing off my processes.."; ps -a | grep sleep | xargs kill -9; wait; exit' SIGHUP SIGINT SIGQUIT SIGTERM SIGKILL
sleep 120
echo 1 $?
if [ $? != 0 ]; then
echo 2 $?
exit 1
fi
pid="$!"
echo "[a]my process pid is: $$"
echo "[a]my child pid list is: $pid"
wait
执行trap.sh
之后会有三个进程
$ ps -a
PID TTY TIME CMD
750 pts/5 00:00:00 trap.sh
751 pts/5 00:00:00 a.sh
752 pts/5 00:00:00 sleep
此时执行 kill -15 750
或 kill-15 751
不会起作用,只有执行 kill -15 752
才会起作用,但是 trap
不会触发
使用异步方式
#!/bin/bash
# trapchild
trap 'echo "[TRAP]I am going down, so killing off my processes.."; ps -a | grep sleep | xargs kill -9; wait; exit' SIGHUP SIGINT SIGQUIT SIGTERM SIGKILL
./a.sh &
err=$?
if [ $err != 0 ]; then
echo 3 $err
exit 1
fi
echo "[TRAP]my process pid is: $$"
echo "[TRAP]my child pid list is: $pid"
wait
#!/bin/bash
# trapchild
trap 'echo "[a]ash I am going down, so killing off my processes.."; ps -a | grep sleep | xargs kill -9; wait; exit' SIGHUP SIGINT SIGQUIT SIGTERM SIGKILL
sleep 120 &
echo 1 $?
if [ $? != 0 ]; then
echo 2 $?
exit 1
fi
pid="$!"
echo "[a]my process pid is: $$"
echo "[a]my child pid list is: $pid"
wait
执行trap.sh
之后会有三个进程
$ ps -a
PID TTY TIME CMD
750 pts/5 00:00:00 trap.sh
751 pts/5 00:00:00 a.sh
752 pts/5 00:00:00 sleep
如果执行 kill -15 752
,不会触发 trap
直接退出
$ ./trap.sh
[TRAP]my process pid is: 2163
[TRAP]my child pid list is:
1 0
[a]my process pid is: 2164
[a]my child pid list is: 2165
如果执行 kill -15 751
,触发 a.sh trap
$ ./trap.sh
[TRAP]my process pid is: 2324
[TRAP]my child pid list is:
1 0
[a]my process pid is: 2325
[a]my child pid list is: 2326
[a]ash I am going down, so killing off my processes..
kill: failed to parse argument: 'pts/5'
如果执行 kill -15 750
,触发 trap.sh trap
$ ./trap.sh
[TRAP]my process pid is: 2487
[TRAP]my child pid list is:
1 0
[a]my process pid is: 2488
[a]my child pid list is: 2489
[TRAP]I am going down, so killing off my processes..
other
当脚本直接同步、异步混合使用时需要考虑周全,详细测试
Ref
原文:大专栏 shell向子进程发送信号
原文地址:https://www.cnblogs.com/chinatrump/p/11606704.html
- 【开源】QuickPager ASP.NET2.0分页控件V2.0.0.1——分页控件的源码 (二)
- 高级时钟约束
- 【开源】QuickPager ASP.NET2.0分页控件V2.0.0.1——分页控件的源码(一) 主体
- 【开源】QuickPager ASP.NET2.0分页控件V2.0.0.1——支持多种数据库。让分页更加简单。
- IO约束(下)
- 可以通过基类实现的几种功能。vs2008 .net 2.0
- Python基础知识2:字典
- 桶式移位器
- 【开源】QuickPager ASP.NET2.0分页控件V2.0.0.7 增加了一个js函数的分页方式。
- FireEye报告:揭露新型工控系统恶意软件TRITON
- 【开源】QuickPager ASP.NET2.0分页控件V2.0.0.6 修改了几个小bug,使用演示。
- Invoke-PSImage:将PS脚本隐藏进PNG像素中并用一行指令去执行它
- linux的内存清理相关知识!
- 一个页面搞定几乎所有的列表需求的实现思路和一点代码。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 备份和恢复 timescaledb 的超级表 (hypertables)
- CVE-2020-14644 weblogic iiop反序列化漏洞
- Ubuntu 17.10 安装折腾记录
- charles工具使用
- 干货 | 从0到1,搭建一个体系完善的前端React组件库
- LeetCode 01两数之和&02两数相加
- 给GitHub "彩蛋" readme 生成自定义统计信息
- Android |《看完不忘系列》之okhttp
- pt-osc改表过程中的中文乱码问题
- Hive Query生命周期 —— 钩子(Hook)函数篇
- python快速排序
- 扩展 Microsoft.Owin.Security
- Angular 2 版本的 ng-bootstrap 初体验
- 揭开MySQL“锁”的神秘面纱
- 从0到1开发测试平台(九)后端对接口response的封装