由于最近一直在弄嵌入式的脚本,经常会用到轮训调用程序的方法,如打流过程,我需要正向,反向轮训,不同的网口的轮训,这样就必须在脚本中杀死iperf3,然后在启动,在比如测试485通讯,我不但要测正向也要测试反向,这样我就必须经常性的终止程序,但是只要终止程序就会在终端显示信息.
如
root@fl-imx6ull:~/1# iperf3 -s &
[1] 752
root@fl-imx6ull:~/1# -----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
root@fl-imx6ull:~/1# killall iperf3
iperf3: interrupt - the server has terminated
[1]+ Done(1) iperf3 -s
root@fl-imx6ull:~/1#
但是这些信息我都存在log里面,在log里面我又不想显示这些信息,那么如何做呢?
刚开始的我还想利用shell里面的异常信息输出到黑洞的方法,就是/dev/null
root@fl-imx6ull:~/1# iperf3 -s &
[1] 754
root@fl-imx6ull:~/1# -----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
root@fl-imx6ull:~/1#
root@fl-imx6ull:~/1#
root@fl-imx6ull:~/1# killall iperf3 >/dev/null
iperf3: interrupt - the server has terminated
[1]+ Done(1) iperf3 -s
root@fl-imx6ull:~/1# killall iperf3 >/dev/null 2>1&
[1] 756
root@fl-imx6ull:~/1# iperf3 -s &
[2] 757
[1] Done(1) killall iperf3 > /dev/null 2> 1
root@fl-imx6ull:~/1# -----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
root@fl-imx6ull:~/1# killall iperf3 >/dev/null 2>1&
[3] 758
root@fl-imx6ull:~/1# iperf3: interrupt - the server has terminated
[2]- Done(1) iperf3 -s
[3]+ Done killall iperf3 > /dev/null 2> 1
root@fl-imx6ull:~/1#
发现这样还是不行.
经过实验,发现了
方法1: 使用set指令
我们知道set指令可根据不同的需求来设置当前所使用 shell 的执行方式,同时也可以用来设置或显示 shell 变量的值,在这里我看到了 set -m 是使用监视模式,当系统启动的时候,我们的默认是使用的监视模式,这样有利于我们快速的查看系统运行是的信息,那么我就可以利用这个功能来实现我的想法了.
root@fl-imx6ull:~/1# iperf3 -s &
[1] 765
root@fl-imx6ull:~/1# -----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
root@fl-imx6ull:~/1#
root@fl-imx6ull:~/1#
root@fl-imx6ull:~/1# set +m killall iperf3
root@fl-imx6ull:~/1#
我们看到,在杀死iperf3的时候,终端没有任何的反应,大喜过往,但是后来发现,这个有个弱点.
root@fl-imx6ull:~/1# ps
PID TTY TIME CMD
664 ttymxc0 00:00:00 sh
765 ttymxc0 00:00:00 iperf3
766 ttymxc0 00:00:00 ps
root@fl-imx6ull:~/1#
就是没有实际上杀次进程,只是让iperf3不在监视了.
方法2 使用()
我们知道在shell中,使用()包含的语句实际上就是新开了一个shell,在里面运算完成后,在返回当前shell,相当于是嵌套的功能,比如我们经常使用expr 就经常加(),还有我们可以使用 value=((${value}+1)) 进行数字运算,都和这些有关系.那么我们就可以利用这一点,
(./485read -d /dev/ttySC2 -b 9600 &)
root@okg2l:~# ps | grep 485read
472 root 1232 R ./485read -d /dev/ttySC2 -b 9600
475 root 3280 S grep 485read
root@okg2l:~# killall 485read
root@okg2l:~# ps | grep 485read
479 root 3280 S grep 485read
root@okg2l:~#
对比一下:
root@okg2l:~# ./485read -d /dev/ttySC2 -b 9600 &
[1] 481
root@okg2l:~# ps | grep 485read
481 root 1232 R ./485read -d /dev/ttySC2 -b 9600
483 root 3280 S grep 485read
root@okg2l:~# killall 485read
[1]+ Terminated ./485read -d /dev/ttySC2 -b 9600
怎么样,看到区别了吧
编写不易,点个赞再走!!!