shell手动执行和cron定时执行的结果不同
-
- 帖子: 14
- 注册时间: 2020-01-08 14:43
- 系统: Linux version 3.2.40
shell手动执行和cron定时执行的结果不同
我有一台dlink nas因为是定制系统所以没办法做开机自启,装了个cron工具配合shell想做个frpc的守护程序取名frpc_dog.sh
#!/bin/sh
path=/mnt/HD/HD_a2/Nas_Prog/frp
frpc_count=`ps | grep /mnt/HD/HD_a2/Nas_Prog/frp/frpc | grep -v "grep" | wc -l`
if [ $frpc_count == 0 ]; then
$path/frpc -c $path/frpc.ini
echo `date` 自启 >> $path/frpc.txt
else
$path/frpc -c $path/frpc.ini reload
echo `date` 重置 >> $path/frpc.txt
fi
手动执行frpc_dog.sh可以正确进行判断if和else
在cron添加一个定时任务
*/1 * * * * /mnt/HD/HD_a2/Nas_Prog/frp/frpc_dog.sh
这个cron工具没有秒,所以这是每分种执行一次
但是从frpc.txt文件来看,每次都得到“重置”指令,没有“自启”指令
我确定ps | grep /mnt/HD/HD_a2/Nas_Prog/frp/frpc | grep -v "grep" | wc -l的结果是0
哪位大神能帮我解释是为什么或者提供另一个方法,谢谢
#!/bin/sh
path=/mnt/HD/HD_a2/Nas_Prog/frp
frpc_count=`ps | grep /mnt/HD/HD_a2/Nas_Prog/frp/frpc | grep -v "grep" | wc -l`
if [ $frpc_count == 0 ]; then
$path/frpc -c $path/frpc.ini
echo `date` 自启 >> $path/frpc.txt
else
$path/frpc -c $path/frpc.ini reload
echo `date` 重置 >> $path/frpc.txt
fi
手动执行frpc_dog.sh可以正确进行判断if和else
在cron添加一个定时任务
*/1 * * * * /mnt/HD/HD_a2/Nas_Prog/frp/frpc_dog.sh
这个cron工具没有秒,所以这是每分种执行一次
但是从frpc.txt文件来看,每次都得到“重置”指令,没有“自启”指令
我确定ps | grep /mnt/HD/HD_a2/Nas_Prog/frp/frpc | grep -v "grep" | wc -l的结果是0
哪位大神能帮我解释是为什么或者提供另一个方法,谢谢
- astolia
- 论坛版主
- 帖子: 6569
- 注册时间: 2008-09-18 13:11
Re: shell手动执行和cron定时执行的结果不同
定制系统啊,那要看你系统上的/bin/sh到底是哪个shell了。你代码里if [ $frpc_count == 0 ]; then这句中的==不符合posix shell规范,如果/bin/sh不是bash这种支持==运算符的shell,[命令的执行会出错,必然会走到else分支。
把==改成=试试?
把==改成=试试?
-
- 帖子: 14
- 注册时间: 2020-01-08 14:43
- 系统: Linux version 3.2.40
Re: shell手动执行和cron定时执行的结果不同
=、-eq都试过了
问题是我手动去运行是可以判断出if条件的,定时每次都跑到else里去了
问题是我手动去运行是可以判断出if条件的,定时每次都跑到else里去了
-
- 帖子: 3
- 注册时间: 2021-06-06 12:57
Re: shell手动执行和cron定时执行的结果不同
试试这样写:
代码: 全选
frpc_count=$(ps -aef | grep -wv -E "$$|grep" | grep -i "/mnt/HD/HD_a2/Nas_Prog/frp/frpc" | wc -l)
-
- 帖子: 14
- 注册时间: 2020-01-08 14:43
- 系统: Linux version 3.2.40
Re: shell手动执行和cron定时执行的结果不同
谢谢楼上的方法,结果还是一样。我想我知道什么原因了。我用cron定时执行了一条指令
echo `ps | grep /mnt/HD/HD_a2/Nas_Prog/frp/frpc | grep -v "grep" | wc -l` >> /mnt/HD/HD_a2/Nas_Prog/frp/frpc.txt
得到结果是6和手动的结果0不一样,我也不清楚为什么定时会得到6
我试着把对比结果改成if [ $frpc_count > 6 ]; then看看
echo `ps | grep /mnt/HD/HD_a2/Nas_Prog/frp/frpc | grep -v "grep" | wc -l` >> /mnt/HD/HD_a2/Nas_Prog/frp/frpc.txt
得到结果是6和手动的结果0不一样,我也不清楚为什么定时会得到6
![:What :What](./images/smilies/What.png)
我试着把对比结果改成if [ $frpc_count > 6 ]; then看看
-
- 帖子: 14
- 注册时间: 2020-01-08 14:43
- 系统: Linux version 3.2.40
Re: shell手动执行和cron定时执行的结果不同
cron的环境和手动的环境不同,ps | grep /mnt/HD/HD_a2/Nas_Prog/frp/frpc | grep -v "grep" | wc -l得到的结果和手动执行的不同,if确认执行了,数据也累加了,但是程序没跑成功 也许frpc不允许后台运行,只能手动运行,也可这个系统的机制不允许。我再查查原因
-
- 帖子: 3
- 注册时间: 2021-06-06 12:57
Re: shell手动执行和cron定时执行的结果不同
看起来你的frpc存在多个进程或重复运行的情况,如果你只希望保持一个进程,则应在判断逻辑上做些调整并且在重启进程前kill掉重复进程。
代码: 全选
#!/bin/sh
path='/mnt/HD/HD_a2/Nas_Prog/frp'
frpc_count=$(ps -aef|grep -i -wv -E "$$|grep"|grep -i "/mnt/HD/HD_a2/Nas_Prog/frp/frpc"|wc -l)
if [ "${frpc_count}" = "1" ]; then
echo `date +%Y%m%d%H%M%S%z` 'frpc is still running' >> ''$path'/frpc.txt'
exit 0
else
## kill
ps -aef|grep -i -wv -E "$$|grep"|grep -i "frpc"|cut -c 9-15|xargs kill -9&&sleep 1
## reload the config file
''$path'/frpc' -c ''$path'/frpc.ini' reload
echo `date +%Y%m%d%H%M%S%z` "重置" >> ''$path'/frpc.txt'
## restart
''$path'/frpc' -c ''$path'/frpc.ini'
echo `date +%Y%m%d%H%M%S%z` "自启" >> ''$path'/frpc.txt'
fi
exit 0
- astolia
- 论坛版主
- 帖子: 6569
- 注册时间: 2008-09-18 13:11
Re: shell手动执行和cron定时执行的结果不同
不知道你系统上的ps是原生的,还是busybox提供的。原生的ps不带参数的话,默认只会输出当前session中的进程,你手动输入时是登录的session,cron运行时是默认root的session,两个不一样的。要用-A或-e参数来列出全部进程才行
-
- 帖子: 14
- 注册时间: 2020-01-08 14:43
- 系统: Linux version 3.2.40
Re: shell手动执行和cron定时执行的结果不同
感谢楼上两位的回复,现在我还有一个难点,通过shell没法将frpc启动起来。直接在cron里运行程序就可以,通过shell运行程序就起不来,有知道是什么原因吗?是程序不能后端运行吗?只能在前端?如果是我要怎样修改才能答到我想要的结果
-
- 帖子: 3
- 注册时间: 2021-06-06 12:57
Re: shell手动执行和cron定时执行的结果不同
我没有用过frp,不清楚它的准确用法,不过我在github上看到了类似的讨论,其中有不错的示例,也许它们能帮到你:
而使用 "grep -wv $$" 过滤自身也很重要,这一点常常被忽略。
另外 @astolia 的意见是有价值的,在应用 ps 与 grep 进行查找筛选的 daemon 类编程时,始终应该留意这方面。frp怎样开机启动和后台运行? #176
https://github.com/fatedier/frp/issues/176
而使用 "grep -wv $$" 过滤自身也很重要,这一点常常被忽略。