shell运行多个脚本,for循环多个端口杀进程

背景知识

获取进程PID杀进程

pid=`lsof -i:7009 | grep LISTEN | awk '{print $2}'`
kill -9 $pid

在Shell脚本中调用另一个脚本的三种方式:

  • source 指定脚本中的命令在同一个shell中运行。(默认shell中的命令都是创建sub-shell,然后执行。执行完后,返回父shell)
  • fork 就是创建sub-shell运行脚本中的命令,和默认运行方式相同。
  • exec 和source相似,区别就是,运行完毕命令后退出,不会返回父shell
     

shell运行多个脚本 、多个命令

1.每个命令之间用;隔开

说明:各命令的执行给果,不会影响其它命令的执行。换句话说,各个命令都会执行,但不保证每个命令都执行成功。

2.每个命令之间用&&隔开

说明:若前面的命令执行成功,才会去执行后面的命令。这样可以保证所有的命令执行完毕后,执行过程都是成功的。

3.每个命令之间用||隔开

说明:||是或的意思,只有前面的命令执行失败后才去执行下一条命令,直到执行成功一条命令为止

4.同时运行多个命令的方式:&符号。

注意:试验了多次   ; 和  kill -2都没解决问题,&符号和 ()一起,才解决了同时执行三个不同目录下多个sh脚本的问题。

参考了这篇文章:https://blog.csdn.net/Scythe666/article/details/85244901


#!/bin/sh
#修改前的脚本
python a.py > logs/a.log
python b.py > logs/b.log
python c.py > logs/c.log

#运行发现只有一个python进程,看日志发现只有a运行了,b和c都没跑起来。
#估计因为shell是顺序执行的,a没执行完,所以不会去执行b和c,查了一下果然。
#修改后


#!/bin/sh
#启动前先停止所有py进程:
ps -ef | grep python | cut -c 9-15| xargs kill -s 9
#shell也提供了一个同时运行多个命令的方式:&符号
python a.py > logs/a.log & python b.py > logs/b.log & python c.py > logs/c.log

我的疑问:有多个sart .sh脚本,启动A后,不停的打日志,就不执行后面的start2.sh了

问题: 有多个sart .sh脚本,启动A后,不停的打日志,就不执行后面的start2.sh了,一般在Terminal里面就按Ctrl+C了。

但是怎么在shell脚本里面实现这个呢?

百度结果:

做自动化测试, 需要用instruments命令启动模拟器, 这个命令启动模拟器后不会自动退出. 需要按Ctrl+C, 并且在退出时, 这个命令会写数据到指定文件, 我们也需要拿到这些数据. 如何在shell脚本或者其他编程语言中实现在Terminal里面按Ctrl+C的效果?

作者答复用了  kill -2

但是,我试验了kill -2对我 并不起作用啊???

我后面的解决办法:用了重定向,不想再屏幕上看到输出结果。然后用了 &符号让多个shell脚本同时执行。

/dev/null 文件
如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null:
举例 $ command > /dev/null
/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。

如果希望屏蔽 stdout 和 stderr,可以这样写:
$ command > /dev/null 2>&1
注意:0 是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。

如何利用shell在终端下输了ctrl+z,ctrl+c,ctrl+d

通常来说:
ctrl-c 是发送 SIGINT 信号,
ctrl-z 是发送 SIGSTOP信号
ctrl-d 不是发送信号,而是表示一个特殊的二进制值,表示 EOF

具体你可以 stty -a 查看系统设置

你如果想在脚本中实现,举个例子:

sleep 100 &
pid=$!
kill -SIGSTOP $pid  # 相当于 ctrl-z
kill -SIGCONT $pid  # 相当于 fg
kill -SIGINT $pid   # 相当于 ctrl-c

多个同名的sh脚本怎么用一个sh脚本执行?

问题背景描述:

比如A目录下有好几个子文件
A:/a
A:/b
A:/c
A:/d
每个文件夹都有个同名的down.sh,我想同时运行这个down.sh ,如何弄?

如果一个个进到对应目录执行也是OK的,但是比较麻烦。就想汇总1个SH来执行多个sh脚本比较省事。

下面这个网友的一行命令非常好,但是我那多个sh脚本里面,有的是相对路径,有的是绝对路径,执行会报错文件不存在之类的(文件不是我写的,我也懒得去改了)

find . -iname down.sh -exec \{\} \;

参考了另外的答复,写了1个sh脚本,测试了下,没发现啥问题

for 变量 in 父目录/*                         遍历父目录里面的全部子目录

#!/bin/bash
for folder in /tools/apps/*
do
# 这里的-d 参数判断$folder是否存在,-f 参数判断 $file 是否存在
if [ -d $folder ] && [ -f $folder/down.sh ]; then
     cd $folder && chmod +x $folder/down.sh &&  $folder/down.sh && echo "$folder ok"
fi
done

怎么用1个shell杀掉多个指定的端口呢

问题描述:目录里面部署了多个服务。每个服务的端口是分配的固定的。一个个的杀好麻烦,一个shell自动杀岂不更好

for 变量 in $数组[*]               遍历数组里的端口号    

#!/bin/bash
#"down_all.sh"杀掉shell脚本所在目录里面指定端口的进程
a=(7002 7003 7004 7005)
for port in ${a[*]}; do
#echo $i
#把命令提取到的进程id赋值给变量id。语法是:反单引号把命令括起来,赋值给变量
id=`lsof -i:$port |grep -i 'LISTEN'| awk '{print $2}'`
kill -9 $id && echo "kill $port success" 
done

怎么用1个shell查看多个指定端口的状态呢?

#!/bin/bash
#"p_all.sh" 查看指定端口的状态
a=(9002 9003 9004 9005 9007 )
for port in ${a[*]}; do
#echo $i
id=`lsof -i:$port |grep -i 'LISTEN'`
echo $id
done
发布了94 篇原创文章 · 获赞 46 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/lelemom/article/details/95987770
今日推荐