• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:クライアントの起動確認)

クライアントの起動確認

このQ&Aのポイント
  • 事務所のパソコンをSambaを使ってファイルサーバとして利用しています。
  • 特定の時刻になると他のパソコンが起動していなければサーバをシャットダウンする予定です。
  • 自宅や小規模事務所ではWindowsでの作業が十分だと思っていましたが、ファイルサーバ用にGLANTANKを購入し、LINUXの設定にも挑戦しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.5

Windowsはブロードキャストのpingに応答しないようですね。これも駄目か。 何らかのブロードキャストに応答してくれればいいんですが。 やはり個別にpingするしかないのか。 for i in `seq 2 254` do ping -c 1 192.168.0.$i & done sleep 1 PC=以下略 と、バックグラウンドでpingすれば時間を節約できます。

taminchu
質問者

お礼

最終報告です。 ファイルサーバのアドレスを抜くのを忘れ、しばらく遮断できず。そのため、クライアントの遮断・起動を繰り返す。LANケーブルを抜けばいいだけだったのに...。 最終的に、shutdownの時刻をtxtに落とすのも追加し、無事に動いております。明日事務所でも試そうと思っています。 いろいろ苦労した甲斐があり、勉強になりました。 事務所ではパソコンの設定に慣れているものが皆無のため、その苦労を微塵も見せずにまた一歩一目置かれるようにさらっと設定したいと思います(マニアとして一目置かれているのかも)。 #PC起動していなければ遮断 if test $PC = 0 then echo $(date +%Y%m%d%H%M) SHUTDOWN >> /home/samba/log.shutdown.txt /sbin/shutdown -h now fi

taminchu
質問者

補足

#!/bin/sh #サーバシャットダウン用 #変数 #PC:PC起動確認スイッチ PC=0 #サブネット内にping for i in `seq 2 254` do #PCが起動していればもうpingしない if test $PC = 0 then ping -c 1 192.168.0.$i fi #ping応答ありのときPC:ON if test $? = 0 then PC=1 fi done #PC起動していなければ遮断 if test $PC = 0 then /sbin/shutdown -h now fi 自分なりに工夫して上のようなスクリプトになりました。 (1).pingしたときの応答値でPC起動を確認 (2).起動いていればもうpingしない whileでもできるかなぁと思いましたが、PCスイッチの判断とseq 2 254を同時に満たせるかどうか判らずこのようになりました。 バックグラウンドだと応答値が取得できず、pingをフォアでの実行にしました。思ったより時間がかかるので1分ではなく10分ごとにcronで実行中。 この後パソコンを切って、いよいよ最終テストです。

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.4

手動時とcrontabで動作が違うのは殆どの場合環境変数の違いです。 おそらく、arp にPATHが通ってなくて、エラーになり何も標準出力に出力されず、wc -lが0になっていると思われます。/sbin/arp にしてください。 grep だと本来は、. を \. と書かないといけませんが、今回はまあ大丈夫ですね。

taminchu
質問者

補足

ありがとうございます。 shutdownのときも同じような状況にあったのに 気づきませんでした。自分の環境だとPATHは/usr/sbin/でした。 #!/bin/sh #サーバシャットダウン用 ping -b -c 2 192.168.0.255 PC=`/usr/sbin/arp -a | grep -v '(192.168.0.1)'` echo $PC > /home/samba/log.shutdown.$(date +%H%M).txt arp結果を落として様子を見ています。 SSHでサーバにログインしているときは、きっちりとarp結果がtxtに落とされていますが、ログインしていないときには何も表示されません。 ファイルサーバにアクセスしていれば、arpで認識されるかもしれませんが、クライアントが起動していれば認識してくれないと勝手にshutdownされてしまいそうです。 sshでログインしているときにOKということは、サブネット内pingも通っているはずなのに...。

すると、全ての回答が全文表示されます。
  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.3

#1,#2です。 smbtreeだとパスワードを聞いてきますね。 ping -b 192.168.0.255 などと -b オプションをつければブロードキャストできるようです。 ネットワークが、192.168.0.0/24 で、ルーターが192.168.0.1 の場合、 ping -c 1 -b 192.168.0.255 PC=`/sbin/arp -a | fgrep -v '(192.168.0.1)' | wc -l` if test $PC = 0 then shutdown -h now fi

taminchu
質問者

補足

いろいろ試行錯誤しながらやっています。 コマンドをひとつひとつ確認しながらなので 報告に時間がかかってすいません。 水曜日の休みの日に自宅のサーバで試してみたスクリプトです。 #!/bin/sh #サーバシャットダウン用 ping -b -c1 192.168.0.255 PC=`arp -a | grep -v '(192.168.0.1)'| wc -l` if test $PC = 0 then /sbin/shutdown -h now fi ここに至る経緯 (1).smbtreeコマンドはなぜか反応なし。 sambaは3.0.14だったと思います。 smbtreeの情報が少なく、インストールされているのか、するものなのかわからずsmbtreeをあきらめ、サブネットにブロードキャスト (2).grepとfgrepの違いがよくわからずとりあえずgrepで (3).wcのオプションを-だけ、lは|と読み違え、しばらく困惑 (4).とりあえずエラーもなく動くようになったので、欲張ってcrontabに1分ごとに動くよう設定 (5).サブネット内の他のパソコンが動いているのにサーバ終了。 (6).起動後、1分以内でシャットダウンされてしまうので自分の欲深さを呪いながら必死にcrontabを変更。 スクリプトを手動実行するときは、シャットダウンされないのに、crontabで実行すると他の端末がついていようと切れてしまいます。 今、出先なので明日またいろいろ試してみようと思います。まずは、arpした結果がどうなっているかtextに落とすようスクリプトを変更し、そこから探っていこうと思います。

すると、全ての回答が全文表示されます。
  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.2

#1です。 サブネットが1つしかない範囲で使うのであれば、arp -a が使えると思います。Windows2000/XPにもあるコマンドです。 これは論理的なアドレスであるIPアドレスと、LANインタフェース固有の物理アドレスであるMACアドレスの対応表を表示するものです。 まず何らかの手段でブロードキャストを行います。その後で、arp -a をやって、結果からルーター等常時オンになっているものを除いたものが起動しているPCになるので、これが無ければOKということになります。 テストしてませんが、こんな感じでいけると思います。 smbtree -b PC=`arp -a | fgrep -v '(192.168.0.1)' | wc -l` if test $PC = 0 then shutdown -h now fi

すると、全ての回答が全文表示されます。
  • notnot
  • ベストアンサー率47% (4903/10364)
回答No.1

他のコンピュータの生死の判断にpingを使うのはきわめて一般的な方法です。 pingを使うのがどういう面でスマートでないと感じているのでしょうか?それがわからないと、「スマートな」方法を出しようが無いです。 参考にされているページを見てみましたが、素人が試行錯誤している感じで、勉強という意味では参考にしないほうが良いと思います。まあとりあえず動くスクリプトではあるので、勉強するつもりは無く、動くスクリプトがあればいいならここのをコピーするのもいいでしょう。

taminchu
質問者

補足

すいません。補足したつもりがボタンを押し忘れたようで反映されていなかったので、遅ればせながら補足を。 pingがスマートでない、のではなくひとつひとつのIPにpingを打つのがスマートではないなぁという事です。 事務所では6台のPCにDHCPでIPを割り振っているので、IPをいくつか列挙しておけば対処できますが、PCをふやしたとき等にスクリプトを書き換えなくても済むようにしたいのです。 (1)ある範囲(サブネット単位?)でpingを打てるようなものか、(2)for~nextなどを使いある程度余裕を持ったIPにpingを打つかを検討しています。 (1)のような方法があれば、教えてください。 よろしくお願いします。

すると、全ての回答が全文表示されます。

関連するQ&A