如何建立一個簡單的腳本來終止 uhttpd,然後啟動 lighttpd?

如何建立一個簡單的腳本來終止 uhttpd,然後啟動 lighttpd?

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

相關內容