我有一個預設運行的路由器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