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