OpenWrt(嵌入式Linux系统)创建一个shell自启动脚本,运行 ser2net 模块,导致的重复启动5次的问题

版本:
Linux version 3.18.29
OpenWrt/Linaro GCC 4.8-2014.04 unknown

问题:自启动服务文件启动后,会自启动5次 ser2net 服务。

shell代码:

#!/bin/sh

process_pid=`ps -w | grep -w "ser2net" | grep -v grep| awk '{print $1}'`
id=${#process_pid}  
if [ $id -gt 4 ]
then 
/etc/init.d/ser2netservice stop &
ser2net &
echo "yes"
else
echo "Start"
ser2net &
fi

具体实操测试流程:

root@Hiwooya:~# /etc/init.d/ser2netservice start
root@Hiwooya:~# ps -w|grep ser2net
 1819 root       856 S    ser2net
 1828 root       852 S    ser2net
 1830 root      1484 S    grep ser2net
root@Hiwooya:~# ps -w|grep ser2net
 1819 root       856 S    ser2net
 1828 root       852 S    ser2net
 1832 root      1484 S    grep ser2net
root@Hiwooya:~# ps -w|grep ser2net
 1819 root       856 S    ser2net
 1828 root       852 S    ser2net
 1834 root      1484 S    grep ser2net
root@Hiwooya:~# ps -w|grep ser2net
 1819 root       856 S    ser2net
 1828 root       852 S    ser2net
 1843 root       852 S    ser2net
 1845 root      1484 S    grep ser2net
root@Hiwooya:~# ps -w|grep ser2net
 1819 root       856 S    ser2net
 1828 root       852 S    ser2net
 1843 root       852 S    ser2net
 1854 root       852 S    ser2net
 1856 root      1484 S    grep ser2net
root@Hiwooya:~# ps -w|grep ser2net
 1819 root       856 S    ser2net
 1828 root       852 S    ser2net
 1843 root       852 S    ser2net
 1854 root       852 S    ser2net
 1865 root       852 S    ser2net
 1867 root      1484 S    grep ser2net
root@Hiwooya:~# /etc/init.d/ser2netservice stop
Killing the process_pid [ 1819 ]
killed pid 1819 success
Killing the process_pid [ 1828 ]
killed pid 1828 success
Killing the process_pid [ 1843 ]
killed pid 1843 success
Killing the process_pid [ 1854 ]
killed pid 1854 success
Killing the process_pid [ 1865 ]
killed pid 1865 success
Killing the process_pid [ 1876 ]
killed pid 1876 success

我这里使用 ser2net 模块(ser2net这里是有环境变量的)直接运行,它就不会自己启动5次,看来不是 ser2net 模块问题,这里就有些不懂是哪里出问题了,看来 Linux 这条路还是有很长的路要走,在这里想求教下,具体是 Linux 内部的机制问题,还是其他的问题。

root@Hiwooya:~# ser2net
root@Hiwooya:~# ps -w|grep ser2net
 1890 root       856 S    ser2net
 1892 root      1484 S    grep ser2net
root@Hiwooya:~# ps -w|grep ser2net
 1890 root       856 S    ser2net
 1894 root      1484 S    grep ser2net
root@Hiwooya:~# ps -w|grep ser2net
 1890 root       856 S    ser2net
 1896 root      1484 S    grep ser2net
root@Hiwooya:~# ps -w|grep ser2net
 1890 root       856 S    ser2net
 1898 root      1484 S    grep ser2net
root@Hiwooya:~# /usr/sbin/ser2net
root@Hiwooya:~# ps -w|grep ser2net
 1890 root       856 S    ser2net
 1901 root       852 S    /usr/sbin/ser2net
 1903 root      1484 S    grep ser2net
root@Hiwooya:~# ps -w|grep ser2net
 1890 root       856 S    ser2net
 1901 root       852 S    /usr/sbin/ser2net
 1905 root      1484 S    grep ser2net
root@Hiwooya:~# ps -w|grep ser2net
 1890 root       856 S    ser2net
 1901 root       852 S    /usr/sbin/ser2net
 1907 root      1484 S    grep ser2net
root@Hiwooya:~# ps -w|grep ser2net
 1890 root       856 S    ser2net
 1901 root       852 S    /usr/sbin/ser2net
 1909 root      1484 S    grep ser2net
root@Hiwooya:~# ps -w|grep ser2net
 1890 root       856 S    ser2net
 1901 root       852 S    /usr/sbin/ser2net
 1911 root      1484 S    grep ser2net
root@Hiwooya:~#

此外,这里有点奇特的地方,应该在于如果我直接在终端运行我的shell代码,就不会出现这样的问题 —— 骚操作。

如下所示:

root@Hiwooya:~#
root@Hiwooya:~# process_pid=`ps -w | grep -w "ser2net" | grep -v grep| awk '{print $1}'`
root@Hiwooya:~# id=${#process_pid}
root@Hiwooya:~# if [ $id -gt 4]
> then
> /etc/init.d/ser2netservice stop &
> ser2net &
> echo "yes"
> else
> echo "Start"
> ser2net &
> fi
ash: missing ]
Start
root@Hiwooya:~# ps -w|grep ser2net
 1971 root       856 S    ser2net
 1973 root      1484 S    grep ser2net
[1]+  Done                       ser2net
root@Hiwooya:~# ps -w|grep ser2net
 1971 root       856 S    ser2net
 1975 root      1484 S    grep ser2net
root@Hiwooya:~# ps -w|grep ser2net
 1971 root       856 S    ser2net
 1977 root      1480 R    grep ser2net
root@Hiwooya:~# ps -w|grep ser2net
 1971 root       856 S    ser2net
 1979 root      1484 S    grep ser2net
root@Hiwooya:~#

虽然,我已经找到替代 ser2net 模块自启动服务的方法了,但仍旧希望可以解开这个困惑,所以,这里就看大佬会不会被我的问题炸出来,看我运气了,当然最好是我能在自己平时学习时,自己解开困惑,那就更好了。

                                       END
阅读 2k
1 个回答

if [ $id -gt 4]

你这个语句是非法的,4后面需要空格,这很可能就是你脚本陷入非预期结果的一个原因,请留意你终端运行是的报错:ash: missing ]
另外你的/etc/init.d/ser2netservice是什么内容,看起来你没有贴全?

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题