我有一个默认运行的路由器uhttpd
,并且有一个进程使用lighttpd
“我想运行”。由于两个进程共享相同的端口,我想杀死uhttpd
然后自动启动lighttpd
(通过将包含命令的脚本设置为cron
重新启动时运行的作业)。
当我运行命令时,我想单独进入脚本,它们起作用了。当我将它们放入脚本中时,我收到一条错误消息,告诉我端口号正在使用中。命令是:
killall uhttpd
/etc/init.d/lighttpd start
到目前为止我的简单脚本是:
#!/bin/sh
killall uhttpd
sleep 5 #To give the device time to release the port
/etc/init.d/lighttpd start
答案1
我不会等待 5 秒并希望这会起作用,你可能会等待太久或太短。您可以用来nc -z
测试端口是否(仍在)被使用,并执行以下操作(我假设他们正在“争夺”端口 80):
#!/bin/bash
for i in $(seq 5); do
if ! nc -z localhost 80; then
break
fi
echo $i
sleep 1
done
if nc -z localhost 80; then
killall -9 uhttpd
sleep 1
fi
if ! nc -z localhost 80; then
/etc/init.d/lighttpd start
else
echo 'port not free'
fi
如果等待 5 次后进程仍未被杀死,请更强力地将其踢出,并且仅在端口空闲时启动 lighttpd。
您应该调查是否有东西正在重新启动 uhttpd(例如首先启动它的进程)。也许您正在使用的留下了足够的时间来重新启动(例如,在运行脚本之前和之后sleep 5
查看进程号)。uhttpd