uhttpd を終了して lighttpd を起動する簡単なスクリプトを作成するにはどうすればよいですか?

uhttpd を終了して lighttpd を起動する簡単なスクリプトを作成するにはどうすればよいですか?

デフォルトで実行されているルーターがありuhttpd、代わりに実行したいプロセスがあります。両方のプロセスが同じポートを共有しているため、強制終了してから自動的に起動したいlighttpdと思います(コマンドを含むスクリプトを再起動時に実行されるジョブとして設定することにより)。uhttpdlighttpdcron

スクリプトに入力したいコマンドを個別に実行すると、正常に動作します。スクリプトに入力すると、ポート番号が使用中であることを示すエラー メッセージが表示されます。コマンドは次のとおりです。

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

関連情報