技术解析

各位大佬我这段 sh 脚本有什么问题吗?
0
2021-06-29 09:41:00
idczone
#!/bin/bash
CheckURL="http://www.baidu.com/" #自定义远程地址,访问状态为 200 时执行启动 ssh 命令。

STATUS_CODE=`curl -o /dev/null -m 5 --connect-timeout 5 -s -w %{http_code} $CheckURL`
if [ "$STATUS_CODE" = "200" ]; then
service sshd start
fi
我试了一直不行,后来我 ping 了一下,再执行就成功了,这是为何。没 ping 之前一直不成功。
别说解析问题哦,我在测试机子的时候,用计划定时执行的,已经测试了几天了 SSH 一直没启动。
我也以为是解析问题,之后我用 VNC 登录后 ping 了一下再执行就成功了,我一脸懵 b...

有调试么?比如在你不行的时候,status_code 是多少?

这真没有,用 crond 挂着定时,结果没执行,应该怎么看结果。echo 到文本里?

嗯,重定向到某个文件就可以看。
* * * * * /your/script.sh > /var/log/xx.log 2>&1

感谢,有个疑问 2 和 &1 代表什么,不太懂。

1 stdout
2 stderr
大概是这么个意思

现在不能重现之前的情况了,因为 ping 了,所以现在执行都是成功的。
没 PING 之前我执行 sh 123.sh 没什么提示,PING 了之后,我再执行就有启动 SSH 提示了。

谢谢解答,后面那个&1 是代表什么

把 2 重定向到 1,大概这么个意思

2 是错误信息,1 是正确的输出结果,就是把这俩信息都输出

我猜是 ping 每次都 lookup dns server, curl 则默认读你本地的 dns cache
起初你系统里的 dns cache baidu 的 ip 失效了,所以无法返回 200,而当你 ping 了一次之后,dns cache 的 baidu entry 就被 renew 了。
以上是猜测,不对请指正。。。

ping 完才成功就是解析问题

感谢解答。

那么是不是脚本应该改进或者修改什么?

如果想偷懒就在调用之前执行一下 ping 咯

哈哈哈,好吧,刚才想安装 nscd 服务,后来想想 ping 也可以,节省资源。
我先在脚本前面加个 PING 试试

/123.sh: line 6: service: command not found
log 错误提示




@Lpl


CheckURL="http://www.baidu.com/" 200 时执行启动 ssh 命令。
ping -c 4 $CheckURL
STATUS_CODE=`curl -o /dev/null -m 5 --connect-timeout 5 -s -w %{http_code} $CheckURL`
if [ "$STATUS_CODE" = "200" ]; then
service sshd start
fi

/etc/init.d/sshd start
centos6+原来要这样

感谢,不过-c 1 就可以了吧.....

你用 cron 跑,service 路径不在 PATH 里
在 /etc/crontab 里修改(假定你的发行版 service 在 /usr/sbin/下):
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/sbin/service

谢谢,涨知识了。
我现在用 /etc/init.d/sshd start 这条命令能启动。6 以下应该都适用。

。。。

玩 cron 的时候有一些地方要注意
比如所有路径都得是绝对路径,包括脚本里边的文件输出

OK,明白了。嘿嘿。第一次搞这个。基本都是百度查资料。

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服