想请教各位 v2 shell 脚本比较精通的,被这个问题卡住了.

2022-04-16 08:42:12 +08:00
 freaks
自己写了个检测宽带公网出口 ip 变化的脚本,并通过企微的群聊机器人通知,想放到后台一直运行,但都是运行了:
nohup sh scriptName.sh > /dev/null 2>&1 & 后 使用 ps - ef | grep scriptName.sh 后显示了一次,在此运行命令就看不到运行了。我用 bash -x script Name.sh 可以运行成功,也可以发起通知,但就是放不到后台执行,不知道哪里出问题了,还请各位大神不吝赐教,小弟在此谢过了. 搜了好多文章也没找到问题原因,要😭了.
4707 次点击
所在节点    Linux
34 条回复
felixcode
2022-04-16 13:59:11 +08:00
用 cronjob 或 systemd 做吧,还能看看执行日志,nohup 太山寨了
oneisall8955
2022-04-16 14:04:04 +08:00
在 cron 定时知道就行了
Cbdy
2022-04-16 14:29:25 +08:00
可以用 pm2
pengtdyd
2022-04-16 14:51:31 +08:00
我就是脚本小王子,哈哈哈哈。盲猜 99%是因为脚本里面报错,所以进程退出了。
freaks
2022-04-16 15:02:06 +08:00
@oneisall8955 已经使用定时任务替代,用 systemd 可以不加 while 一直运行吗
zhouzm
2022-04-16 15:26:49 +08:00
你的脚本是在 linux 下运行还是在 openwrt 下运行?
zhouzm
2022-04-16 15:39:22 +08:00
上面有人说 nohup 太山寨这种说法是不妥的,cron 只支持最小 1 分钟的间隔频率,如果对监控结果实时性敏感度高的话,用脚本循环判断是比较简便的方案。

@freaks 我上面给的脚本是我一直在用的,用途是判断网关是否在线,是完整的循环处理代码,你只需要把 while 循环内代码替换成你的检测脚本就可以了。
手动运行测试的时候可以把 while true; do 注释掉,使用上面一行,100 是你想测试循环的次数,测试不报错后再改成一直循环,然后 nohup check-gateway.sh $IP >/dev/null 2>&1 & 运行就可以了。

bash 的 sleep 是不消耗 cpu 的,可以放心大胆的使用。
freaks
2022-04-16 16:20:31 +08:00
@zhouzm 非常感谢🙏提供思路,我这里就是 Linux 系统下,这东西存在就有意义,不然不早被拿掉了,说山寨未免太那个了。我抽空试试你的方法,现在先 crontab 一段时间.
Cu635
2022-04-16 16:25:18 +08:00
@zhouzm
@freaks
说 nohup 山寨是因为有了更好用的 screen 吧……
huntagain2008
2022-04-16 16:31:41 +08:00
新手昨天刚看到 1983 年 unix 编程环境 5.3while 和 until
$cat watch who
...
while : # coop forever
do
who>$new
diff $new $old
sleep 60
done
...
$
:是 shell 内部命令,它仅仅计算参数值,然后返回“真”。while 循环体,只要命令返回状态为真便继续执行。还可以自定义时间间隔
$cat check mail
...
t=$(1-60)
...
$
时间间隔依然设为 60 秒,但在命令行提供了一个参数,如果键入下面命令
$ checkmail 30
就使用新的时间参数。如果提供了时间参数,shell 变量 t 被设为对应的时间间隔,如果未提供,缺省时间间隔为 60 秒
felixcode
2022-04-16 16:50:32 +08:00
说 nohup 山寨是因为缺乏基本的监测控制。
这个程序是作为监测服务运行的,如果 nohup 进程挂了,不会自动重启,也不会有任何通知,而管理员是完全不知道的。
用 systemd 就能避免这样的情况,cron 的话可以不在意前面的运行是否成功。
baobao1270
2022-04-17 06:33:22 +08:00
上面说用 systemd 做成 service 的都是什么人啊
systemd 的正确用法是做成 timer
felixcode
2022-04-17 12:13:36 +08:00
@baobao1270 既能用 timer 也能用来控制循环脚本啊,用法又不唯一
hcql
2022-04-19 10:06:31 +08:00
可以使用这种

#!/bin/sh
while true; do
"checkyouripcommad"
done
sleep 60
done

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/847275

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX