shell手动执行和cron定时执行的结果不同

sh/bash/dash/ksh/zsh等Shell脚本
回复
cnxk
帖子: 14
注册时间: 2020-01-08 14:43
系统: Linux version 3.2.40

shell手动执行和cron定时执行的结果不同

#1

帖子 cnxk » 2021-06-06 11:50

我有一台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
哪位大神能帮我解释是为什么或者提供另一个方法,谢谢
附件
cron.png
头像
astolia
论坛版主
帖子: 6569
注册时间: 2008-09-18 13:11

Re: shell手动执行和cron定时执行的结果不同

#2

帖子 astolia » 2021-06-06 12:10

定制系统啊,那要看你系统上的/bin/sh到底是哪个shell了。你代码里if [ $frpc_count == 0 ]; then这句中的==不符合posix shell规范,如果/bin/sh不是bash这种支持==运算符的shell,[命令的执行会出错,必然会走到else分支。
把==改成=试试?
cnxk
帖子: 14
注册时间: 2020-01-08 14:43
系统: Linux version 3.2.40

Re: shell手动执行和cron定时执行的结果不同

#3

帖子 cnxk » 2021-06-06 12:17

=、-eq都试过了
问题是我手动去运行是可以判断出if条件的,定时每次都跑到else里去了
1ch
帖子: 3
注册时间: 2021-06-06 12:57

Re: shell手动执行和cron定时执行的结果不同

#4

帖子 1ch » 2021-06-06 13:07

试试这样写:

代码: 全选

frpc_count=$(ps -aef | grep -wv -E "$$|grep" | grep -i "/mnt/HD/HD_a2/Nas_Prog/frp/frpc" | wc -l)
cnxk
帖子: 14
注册时间: 2020-01-08 14:43
系统: Linux version 3.2.40

Re: shell手动执行和cron定时执行的结果不同

#5

帖子 cnxk » 2021-06-06 14:41

谢谢楼上的方法,结果还是一样。我想我知道什么原因了。我用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 :What
我试着把对比结果改成if [ $frpc_count > 6 ]; then看看
cnxk
帖子: 14
注册时间: 2020-01-08 14:43
系统: Linux version 3.2.40

Re: shell手动执行和cron定时执行的结果不同

#6

帖子 cnxk » 2021-06-06 14:51

cron的环境和手动的环境不同,ps | grep /mnt/HD/HD_a2/Nas_Prog/frp/frpc | grep -v "grep" | wc -l得到的结果和手动执行的不同,if确认执行了,数据也累加了,但是程序没跑成功 也许frpc不允许后台运行,只能手动运行,也可这个系统的机制不允许。我再查查原因
1ch
帖子: 3
注册时间: 2021-06-06 12:57

Re: shell手动执行和cron定时执行的结果不同

#7

帖子 1ch » 2021-06-06 15:28

看起来你的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定时执行的结果不同

#8

帖子 astolia » 2021-06-07 9:54

cnxk 写了: 2021-06-06 14:41 谢谢楼上的方法,结果还是一样。我想我知道什么原因了。我用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 :What
我试着把对比结果改成if [ $frpc_count > 6 ]; then看看
不知道你系统上的ps是原生的,还是busybox提供的。原生的ps不带参数的话,默认只会输出当前session中的进程,你手动输入时是登录的session,cron运行时是默认root的session,两个不一样的。要用-A或-e参数来列出全部进程才行
cnxk
帖子: 14
注册时间: 2020-01-08 14:43
系统: Linux version 3.2.40

Re: shell手动执行和cron定时执行的结果不同

#9

帖子 cnxk » 2021-06-08 17:49

感谢楼上两位的回复,现在我还有一个难点,通过shell没法将frpc启动起来。直接在cron里运行程序就可以,通过shell运行程序就起不来,有知道是什么原因吗?是程序不能后端运行吗?只能在前端?如果是我要怎样修改才能答到我想要的结果
1ch
帖子: 3
注册时间: 2021-06-06 12:57

Re: shell手动执行和cron定时执行的结果不同

#10

帖子 1ch » 2021-06-08 20:10

我没有用过frp,不清楚它的准确用法,不过我在github上看到了类似的讨论,其中有不错的示例,也许它们能帮到你:
frp怎样开机启动和后台运行? #176
https://github.com/fatedier/frp/issues/176
另外 @astolia 的意见是有价值的,在应用 ps 与 grep 进行查找筛选的 daemon 类编程时,始终应该留意这方面。
而使用 "grep -wv $$" 过滤自身也很重要,这一点常常被忽略。
回复