ページ 11

rxvtからのrebootについて

Posted: 13/01/19(土) 10:26
by TYpup
お世話になります。
Puppy4.3.1JP2012で自宅サーバー構築を試みています。

デスクトップ上から端末を開き、vi で/etc下の定義ファイルを編集した後、
# reboot [enter]
とやってしまうことがあります。この時皆さんのマシンではどうなるでしょう。私のマシンではデスクトップが固まり何が起こっているかわからなくなります。多分、shutdownプロセスが正しく終了されていないのでしょう。

そこで rxvt(端末)からは reboot や poweroff ができないようにロックをかけてしまおうかと思いコマンドの中身を見ました。
-------/sbin/reboot--------
#!/bin/sh

/etc/rc.d/rc.shutdown

exec /bin/busybox reboot
----------------------------
このシェルの起動が rxvt からのものであれば NG のメッセージを echo し、exit してしまおうと思いましたが、自分が誰か whoami コマンドもないので、 ps からプロセスIDと名称を関連付けることもできませんでした。

rxvt から 起動されているということが分かる手段は無いでしょうか。
真の目的は shutdown がきちっと動作し中途半端状態にならないことなので代替手段でも構いません。

Re: 祖父の名前

Posted: 13/01/19(土) 13:16
by サボり魔
確認したいプログラムの呼び出し順は
実行されているスクリプト → bash → bash を呼んだプログラム
という形だと思っていいんでしょうかね?

洗練されてませんが、

コード: 全て選択

#!/bin/bash

echo "私 pid:"$$

father=$(ps -o ppid -p $$ | tail -n 1)
echo "父 pid:"$father

grandpa=$(ps -o ppid -p $father | tail -n 1)
echo "爺 pid:"$grandpa

ps -o cmd -p $grandpa | echo "祖父の名前(起動元)は:" $(tail -n 1)
こんな感じで確認用のスクリプトを書いてみました。
2層上の起動元のプログラムを特定しています。
ただ、2層上であることが前提なので、別のやり方を探すほうがいいかもしれません。

ファイルに保存して実行してみると…
rxvt からの出力

コード: 全て選択

# hoge_pid.sh
私 pid:13561
父 pid: 6159
爺 pid: 6155
祖父の名前(起動元)は: rxvt
urxvt からの出力

コード: 全て選択

# hoge_pid.sh
私 pid:13637
父 pid:12084
爺 pid:12083
祖父の名前(起動元)は: /usr/bin/urxvt
詳しい方はぜひ書き込んでください(私も知りたいです) :)

父の名前

Posted: 13/01/19(土) 17:36
by シノバー
father=$PPID

Re: rxvtからのrebootについて

Posted: 13/01/19(土) 19:10
by TYpup
サボり魔様

コメントありがとうございます。
ルーツを探るのは大変ですね。
自分自身がだれか分からなくても自プロセスが $$ で得られるということをすっかり忘れていました。参考になりました。

色々と触っていて、たまたま tty コマンドを発見しました。
端末 rxvt で tty コマンドを実行すると

/dev/pts/n (nは数字 多分rxvtを開いた時のシリアルナンバー)
と返してくれます。

[ctrl]-[Alt]-[F2]で現れるコンソールで tty コマンドを実行すると
/dev/tty2 と返してくれます。

reboot や poweroff コマンドの中で TERMINAL=`tty` が誰か?で判別できるような気がしています。(まだやっていません)

ちなみにデスクトップの[メニュー]-[シャットダウン]-[コンピューターを再起動]をすると、/sbin/rebootを実行していて、rebootの中に仕掛けてみるとtty コマンドの答えは
/dev/tty1 でした。

従って判断可というのがわかりました。ありがとうございました。

(tty と $$ を組み合わせると Whoami ができるかな)

Re: rxvtからのrebootについて

Posted: 13/01/19(土) 19:30
by double_star
~/.bashrc あたりで reboot 無効にしただけでもいいのでは?

コード: 全て選択

case "$-" in
*i*)
  alias reboot=:
  ;;
esac
追記: ;; の行が抜けてました

Re: rxvtからのrebootについて

Posted: 13/01/19(土) 19:57
by TYpup
rxvt端末の tty の結果でrebootするかどうか判別しました。

---------/sbin/reboot/-----------
#!/bin/sh

set `tty | sed 's/\// /g'` ; Dev=$1 ; TerminalKind=$2
if [ $TerminalKind = "pts" ] ; then
echo "$0 : $TerminalKind, It is the unsuitable terminal."
exit 1
else
/etc/rc.d/rc.shutdown

exec /bin/busybox reboot
fi
---------------------------------
(あら、TABを活かすにはどうしたら.......)

Re: rxvtからのrebootについて

Posted: 13/01/19(土) 20:00
by TYpup
double_star さんが書きました:~/.bashrc あたりで reboot 無効にしただけでもいいのでは?

コード: 全て選択

case "$-" in
*i*)
  alias reboot=:
esac
double_star様
コメントありがとうございます。
デスクトップからの[コンピュータの再起動]やコンソールでのrebootは有効のままでしょうか。であるとすると、シンプルでよいですネ。

Re: rxvtからのrebootについて

Posted: 13/01/19(土) 22:24
by サボり魔
TYpup さんが書きました:この時皆さんのマシンではどうなるでしょう。私のマシンではデスクトップが固まり何が起こっているかわからなくなります。
今更ですが、とりあえず端末から reboot してみたところ完全にフリーズしました(Wary-5.3.92)。

USB メモリにインストールした複数の Puppy から選択して起動しているので、デスクトップメニューの「再起動」すら使ったことがありませんでした…。
(リストの一番上でないと、結局は手作業で選ばないといけないので)
いやぁ、意外なところに罠があるものですね。

double_star さんの ~/.bashrc への追記を試してみたところ、reboot が端末で無効になりつつもデスクトップメニューからは実行できるのを確認しました
こういう使い方するんですね…。
シノバー さんが書きました:father=$PPID
そんなに簡単に取れるなんて知りませんでした。 :oops:

起動時のメッセージに書かれているのを目にしてはいたものの、これまで tty を気にしたこともありませんでした。
色々と参考になる話題にお邪魔させていただきました。皆様ありがとうございます。

Re: rxvtからのrebootについて

Posted: 13/01/20(日) 17:24
by TYpup
サボり魔 さんが書きました: 色々と参考になる話題にお邪魔させていただきました。皆様ありがとうございます。
私も大変勉強させていただいております。皆様今後ともよろしくお願いいたします。

(reboot ですが、 Filer からシングルクリックでもダンマリになりました。これはお手上げです。…ネ。)

Re: rxvtからのrebootについて

Posted: 13/01/20(日) 18:48
by double_star
そう言えば NFS マウントとかしたまま shutdown すると固まるので、自分は /etc/rc.d/rc.shutdown にちょこっと修正入れてるんだけど、関係ありそうです?
sshfs なんかも駄目だっけかな。

コード: 全て選択

--- /initrd/pup_ro2/etc/rc.d/rc.shutdown	2011-11-08 07:08:28.000000000 +0900
+++ /initrd/pup_rw/etc/rc.d/rc.shutdown	2012-05-10 19:46:35.000000000 +0900
@@ -183,7 +183,7 @@
 
 #111107 ldolse: unmount network shares before taking down the network
 #(see 111106, need to do it sooner, but 111106 will remount read-only if failed to umount here)
-for MOUNTPOINT in `mount | grep '^//' | cut -d  ' ' -f 3 | tr '\n' ' '`
+for MOUNTPOINT in `mount | awk '/^[^ ]*:/ || /^\/\//{print $3}'`
 do
  umount -f $MOUNTPOINT
 done 

Re: rxvtからのrebootについて

Posted: 13/01/20(日) 19:58
by TYpup
double_star さんが書きました:そう言えば NFS マウントとかしたまま shutdown すると固まるので、自分は /etc/rc.d/rc.shutdown にちょこっと修正入れてるんだけど、関係ありそうです?
sshfs なんかも駄目だっけかな。

コード: 全て選択

--- /initrd/pup_ro2/etc/rc.d/rc.shutdown	2011-11-08 07:08:28.000000000 +0900
+++ /initrd/pup_rw/etc/rc.d/rc.shutdown	2012-05-10 19:46:35.000000000 +0900
@@ -183,7 +183,7 @@
 
 #111107 ldolse: unmount network shares before taking down the network
 #(see 111106, need to do it sooner, but 111106 will remount read-only if failed to umount here)
-for MOUNTPOINT in `mount | grep '^//' | cut -d  ' ' -f 3 | tr '\n' ' '`
+for MOUNTPOINT in `mount | awk '/^[^ ]*:/ || /^\/\//{print $3}'`
 do
  umount -f $MOUNTPOINT
 done 
double_star様

NFSをマウントしているとshutdownで固まるというのはまた新たな課題なのかなと思います。

私の場合 ext4 と FAT32 をマウントしていますが、同じ状態でも console や GUIのメニューからの操作ではOKで、端末からではNGでした。

※スクリプトは mount コマンドの結果から 行の先頭が / または // のものから、mountpoint の文字列を取得し、unmount しているのでしょうか。ご苦労されているのが伺えます。

名犬にしたくなってきました。

Re: rxvtからのrebootについて

Posted: 13/01/22(火) 08:38
by シノバー
サボり魔 さんが書きました:
TYpup さんが書きました:この時皆さんのマシンではどうなるでしょう。私のマシンではデスクトップが固まり何が起こっているかわからなくなります。
今更ですが、とりあえず端末から reboot してみたところ完全にフリーズしました(Wary-5.3.92)。
(snip)
double_star さんの ~/.bashrc への追記を試してみたところ、reboot が端末で無効になりつつもデスクトップメニューからは実行できるのを確認しました
私も今更ながら確認しました(Precise Puppy)。確かにrxvtから reboot コマンドでフリーズします。
いっぽうデスクトップメニューからのリブートは rebootコマンドではなく、wmreboot を実行しています。rxvtから wmreboot コマンドを実行すると正常に再起動します。また poweroffに相当するのは wmpoeroff です。

したがって .bashrc に alias reboot=wmreboot で解決するのでは。

NFS マウント下での shutdown

Posted: 13/01/22(火) 08:50
by シノバー
double_star さんが書きました:そう言えば NFS マウントとかしたまま shutdown すると固まるので、自分は /etc/rc.d/rc.shutdown にちょこっと修正入れてるんだけど、関係ありそうです?
この問題は最近のパピーでは修正されています。
(/etc/rc.d/rc.shutdown のコメント)
#120219 zekebaby: unmount network shares, alternate method. 120220 another alternate method.

pupsaveconfig の最新版 2.2.5 をインストールすることでも解決するはず。
http://shino.pos.to/linux/puppy/

Re: rxvtからのrebootについて

Posted: 13/01/23(水) 01:25
by TYpup
シノバー さんが書きました:rxvtから wmreboot コマンドを実行すると正常に再起動します。また poweroffに相当するのは wmpoeroff です。

したがって .bashrc に alias reboot=wmreboot で解決するのでは。
シノバー様ありがとうございます。
rxvtからwmreboot,wmpoeroffの実行でうまく行きました。
.bashrcではなく他にもaliasを定義している /etc/profile に 下記の2行を追記してうまく行っています。

コード: 全て選択

alias reboot=wmreboot
alias poweroff=wmpoweroff