想请教各位 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 可以运行成功,也可以发起通知,但就是放不到后台执行,不知道哪里出问题了,还请各位大神不吝赐教,小弟在此谢过了. 搜了好多文章也没找到问题原因,要😭了.
4680 次点击
所在节点    Linux
34 条回复
Tink
2022-04-16 08:49:09 +08:00
你这个脚本里面实现了一直循环?如果没有的话要用 cron
DCCooper
2022-04-16 08:50:54 +08:00
脚本退出了
liangkang1436
2022-04-16 09:10:40 +08:00
@DCCooper 你要不做成服务算了,启动,停止都方便些
plko345
2022-04-16 09:14:09 +08:00
那你把结果重定向到文本里呀,可能脚本不健壮,某次失败退出了,你全都指向 null ,有问题也发现不了
zhouzm
2022-04-16 09:18:28 +08:00
# check-gateway.sh
#! /bin/bash

[[ ! -z "$1" ]] && host=$1 || host=192.168.1.1

c=0
last=0
# while [[ $c -lt 100 ]]; do
while true; do
ping -q -c 1 -W 1 $host >/dev/null
current=$?
if [[ $current == 0 ]]; then
if [[ $last != 0 || $c -eq 0 ]]; then
last=$current
echo $( date +%Y-%m-%d\|%H:%M:%S ) :$host online >> /run/check-gateway.log
fi
else
if [[ $last == 0 ]]; then
last=$current
echo $( date +%Y-%m-%d\|%H:%M:%S ) :$host offline >> /run/check-gateway.log
fi
fi
c=$(( $c + 1 ))
sleep 1
done
exit 0



nohup check-gateway.sh $IP >/dev/null 2>&1 &
ch2
2022-04-16 09:19:21 +08:00
有两个选择:
1. 用 crontab 做成定时任务,每分钟检测一次,每次只跑完就退
2.用 systemctl 做成服务,常驻后台
lcy630409
2022-04-16 09:48:58 +08:00
这个最简单的就是 crontab 了,定时执行即可
freaks
2022-04-16 12:12:45 +08:00
@Tink 就是写了个函数 if 判断下,和随便伪造的一个 IP 比对下,如果不同,就调用函数发到群聊里,相同就把信息输出到一个文本文件,然后不发告警.
freaks
2022-04-16 12:13:26 +08:00
@DCCooper 即没返回 127 也没返回 128
freaks
2022-04-16 12:14:14 +08:00
@liangkang1436 感觉像运行一次就结束了,达不到实时监控的目的
freaks
2022-04-16 12:15:08 +08:00
@plko345 我不指向空,也是默认追加到 nohup.out 没有报错的
freaks
2022-04-16 12:17:20 +08:00
@zhouzm 这个脚本是检测网关的吗?我是要检测出口公网 IP 隔一段时间改变,作提醒,还是感谢回答,我再研究研究
freaks
2022-04-16 12:20:22 +08:00
@ch2 有考虑过这样,但总感觉这个问题很简单,但自己又实在想知道原因,定时任务每分钟运行,可能造成日志过大,如果把周期拉长,可能会有探测不到变化的情况,不知道理解对不对.
freaks
2022-04-16 12:21:09 +08:00
@lcy630409 实在没招了,会考虑,不过现在确实卡住了😂
Tink
2022-04-16 12:32:18 +08:00
@freaks 按你的意思,你的脚本里面本身就是只执行一次啊,要么你就外面套一个死循环,要么就用 cron 定时一分钟运行一次
freaks
2022-04-16 12:34:59 +08:00
#!/bin/bash

#存放变化 IP 的文件

dirfile="/home/ip_change"

# 获取 IP

IP=`curl -s ip.sb`

log="/var/log/tool.log"

datetime=`date '+%Y-%m-%d %H:%M:%S'`

if [ ! -f "$dirfile" ]; then
touch "$dirfile"
echo "1.1.1.1">$dirfile
fi


# 判断公网 IP 是否获取

if [ ! -n "$IP" ]; then
echo "$datetime 公网 IP 获取失败,检查'curl -s ip.sb'">> $log
exit 1
fi

# 查看老 ip

old_ip=`cat $dirfile`


# 调用微信群聊机器人接口

wx_web(){
cat > sendweb.sh << EOF
curl 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=' \
-H 'Content-Type: application/json' -d \
'{ \
"msgtype": "text", \
"text": { \
"content": "公司外网发生了变化 新的 IP: ${IP} 老的 IP: ${old_ip} !!!" \
} \
}'
EOF
chmod +x sendweb.sh
sh sendweb.sh && rm -rf sendweb.sh
}

if [ "$IP" = "$old_ip" ]; then
echo "$datetime IP 正常 - true " >> $log
else
echo $IP > $dirfile
wx_web
fi
freaks
2022-04-16 12:35:54 +08:00
@Tink 下面放了脚本,希望大佬帮忙看看
yaoyao1128
2022-04-16 12:38:57 +08:00
没 loop……
aaa5838769
2022-04-16 12:48:26 +08:00
可以 while 死循环脚本,丢到后台运行。或者用计划任务。
freaks
2022-04-16 12:50:29 +08:00
@aaa5838769 好吧,还是代码的问题,这个是不是在 if 那里加就行了?

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

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

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

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

© 2021 V2EX