出産前後の痔にはご注意!

システムの停止時にあるコマンドを実行したいと考えています。
ネットでの情報を検索すると
/etc/rc.d/halt に実行内容を登録しておけば、そのコマンドが実行されるという内容が
ありましたが、実際にやってみると、実行された形跡がありませんでした。

本当にやりたいことは、システム停止時に、「ある常駐プロセスにSIGTERMを発行したい」
ことなのですが、それをコマンドを登録して実行したいと考えています。

もし、/etc/rc.d/haltに登録して実行された方か、
ほかの方法をご存知の方がおりましたら教えてください。

ちなみに、「ある常住プロセスを立ち上げたまま、システムを停止させると、そのプロセスに対して
SIGTERMがOSから発行されている」と思われるのですが、このことを明確に記述されたものが
見当たりませんでした。もし、間違いなく、OSからSIGTERMが発行されるなら、それでもかまいませんが、その裏づけだけは、取っておきたいとおきたいと考えています。
この件で、ご存知の方がおりましたら、教えて頂けませんでしょうか。

OSはRedhat linux です。(正確なバージョンは今不明ですが、5.5だったかと思います)

A 回答 (1件)

Redhatということですので、シャットダウンの時には、/etc/rc0.d/ の下のスクリプトが名前順に実行されます。

Kで始まるものが順次実行された後、S00killall とS01haltが実行され、S01haltの中で稼働中の全プロセスに SIGTERM が送られますので、特に何もしなくて良いです。

常駐プロセスであればサービス化するのがいいのでは?
/etc/rc.d/init.d の下に、他のサービスに習って起動終了を行うスクリプトを書いて、chkconfig --add で管理ファイルに登録し、chkconfig でどういうときに起動するのか設定します。
すると、他のサービスと同じように適宜、開始終了され、/sbin/service コマンドでも開始終了できるようになります。
    • good
    • 0
この回答へのお礼

>S01haltの中で稼働中の全プロセスに SIGTERM が送られますので、特に何もしなくて良いです。
ありがとうございます。この回答が最も、望んでいたものです。
>常駐プロセスであればサービス化するのがいいのでは?
参考にさせていただきます。
現在は、cronで定時に起動し、定時に停止しています。
ありがとうございました。

お礼日時:2012/04/01 14:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QcentOS7のシャットダウン時のコマンド実行について

centOS7においてminecraftのサーバーを構築しており、シャットダウン時や再起動時にコマンドの実行をしたいのですがどうしたらよいのでしょう。
コマンドの内容は以下です。

ファイル名[mcend.sh]

#!/bin/sh

rsync -a --delete /mnt/ramdisk/ /mnt/ramsave/

/etc/rc.d/init.d/の中にコレをいれてあり、/etc/rc.d/rc0.d/ /etc/rc.d/rc6.d/にchkconfigでS00mcendとしてシンボリックリンクでおいてみたのですがうまくいきません。

#sh /etc/rc.d/init.d/mcend.sh で起動してみるとramsaveにファイルができます。

Aベストアンサー

>/etc/rc.d/init.d/の中にコレをいれてあり、/etc/rc.d/rc0.d/ /etc/rc.d/rc6.d/にchkconfigでS00mcendとしてシンボリックリンクで

SysVinitではなくなりましたからねぇ…。

「CentOS systemd シャットダウン スクリプト」で検索すると
http://www.sssg.org/blogs/naoya/archives/2705
とか見つかります。

QLinuxシャットダウン前処理

Linux(TurboLinuxClient2008)搭載の計算機。計算機電源ボタン停止操作でシャットダウン処理が実施されます。電源ボタン停止操作時にシャットダウン前処理として実行したいコマンドがあります。シャットダウンが実行される前にそのコマンドを実行させるにはどのように設定すればいいのでしょうか?

Aベストアンサー

該当のディストリビューションは使ったことありませんが…
/etc/rc0.dとかありませんか?
シャットダウン時(runlevel0へ移行時)はこの中のスクリプト(実際はシンボリックリンク)が順次実行されるかと。
# ちなみにリブート時は/etc/rc6.d。

ディストリビューションの名前から2008年頃のものでしょうから、upstartとかにはなっていないでしょう。

QLinux shutdown/reboot時の動きについて

Linuxにおいて、OSをshutdownまたはrebootすると
rcスクリプトが動作したりプロセスがSIGTERMを受信したりしますが、
shutdownコマンド投入から電源断までに、
プロセスがどのような順番、方法で停止するか教えてください。

(1)rcスクリプトによる停止が先か、SIGTERM受信による停止が先か
(2)SIGTERMは全プロセスに対して送られるのか
(3)rcスクリプト、SIGTERM以外にもプロセスが停止する契機・方法があるか

よろしくお願いいたします。

Aベストアンサー

shutdown,reboot,halt などを実行すると
/etc/inittab の該当部分のランレベルのスクリプトが動くはずです。
詳しくはman shutdown や、man inittab を参照してください。
============= /etc/inittab より抜粋 =========================
# ランレベルごとの処理(各ランレベル用のrcスクリプトを実行し、その終了を待つ)
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6
=================================================
なので、
reboot = runlevel 6 = /etc/rc.d/rc 6
halt = runlevel 0 = /etc/rc.d/rc 0
が動くと思います。
なので、どういう順番で停止されるのかを知るには
この部分のスクリプトを追っていけばよいかと思います。

うちのSlackwareでは
rcスクリプトで停止→killall5 -15→killall5 -9
としていますが、ディストリビューションごとに細かい部分は異なると思います。

shutdown,reboot,halt などを実行すると
/etc/inittab の該当部分のランレベルのスクリプトが動くはずです。
詳しくはman shutdown や、man inittab を参照してください。
============= /etc/inittab より抜粋 =========================
# ランレベルごとの処理(各ランレベル用のrcスクリプトを実行し、その終了を待つ)
l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/...続きを読む

QOS停止・リブート時のrcスクリプト

いつも参考にしています。

OS停止・リブート時のrcスクリプトについてご教示下さい。

あるアプリの実行シェルを/usr/local/aaaa/start.shに配置し、
/etc/rc3.d/と/etc/rc5.d/配下で下記コマンドを実施し、リンクを張りました。
ln -s /usr/local/aaaa/start.sh S80aaaa

この設定でOS起動時にaaaaのアプリを起動する事は出来ました。

また、/etc/rc6.d/と/etc/rc0.d/配下で下記コマンドを実施したのですが、OS起動時に停止していないように見えます。
(/var/log/messagesを見ても停止する様子が確認できません。手動でシェルを実行した場合は/var/log/messagesにログが残ります)
ln -s /usr/local/aaaa/stop.sh K10aaaa

ここでのstart.sh/stop.shは単純にアプリの起動コマンド・停止コマンドを書いてあるだけのものです。
/etc/rc6.d/K10aaaaaを直接手動で実行すればアプリの停止は可能です。

同じように設定しているのになぜ停止のほうだけうまく動かないのかが分かりません。何かアドバイスがあればお願いします。

いつも参考にしています。

OS停止・リブート時のrcスクリプトについてご教示下さい。

あるアプリの実行シェルを/usr/local/aaaa/start.shに配置し、
/etc/rc3.d/と/etc/rc5.d/配下で下記コマンドを実施し、リンクを張りました。
ln -s /usr/local/aaaa/start.sh S80aaaa

この設定でOS起動時にaaaaのアプリを起動する事は出来ました。

また、/etc/rc6.d/と/etc/rc0.d/配下で下記コマンドを実施したのですが、OS起動時に停止していないように見えます。
(/var/log/messagesを見ても停止する様子が確...続きを読む

Aベストアンサー

ディストリが Redhat であれば、以下のような設定をスクリプトに追加してください。これはアプリケーションが現在起動しているかどうかを確認するために使用されます。(二重起動、停止を避けるため)

'start')
touch /var/lock/subsys/aaaa

'stop')
rm -f /var/lock/subsys/aaaa

多分、起動時に /var/lock/subsys/aaaa を作成していないために、aaaa は起動していないと判断されて、stop 処理が行われなかったと考えられます。

Qapt-get install ****** でinstallしたものをuninstallするには?

御世話になります。
vncserverだけをinstallするつもりが
誤って
apt-get install vncとうってしまいました。
これをuninstallしたいのですが
どのようにすればよろしいでしょうか?

教えて下さい。

Aベストアンサー

# apt-get remove パッケージ名
では、設定ファイルは削除されずに残ります。

完全に削除するときは、
# apt-get --purge remove パッケージ名
です。

QNTPで同期が始まらない

こんにちは。
度々すみません、NTPの設定をしましたがどうも同期が始まりません。

「ntpdate 130.69.251.23」と手動同期は成功します。
しかしntpデーモンを起動し1時間以上放置しても同期されません。
※外部タイムサーバー参照としてます

ntp.confは下記のとおりです。
---------------------------------------------------
server 133.100.9.2 # clock.nc.fukuoka-u.ac.jp
server 130.69.251.23
driftfile /var/lib/ntp/drift
---------------------------------------------------

でntpq -pの結果は下記となります。

remote refid st t when poll reach delay offset jitter
==============================================================================
133.100.9.2 .INIT. 16 u - 64 0 0.000 0.000 4000.00
130.69.251.23 .GPS. 1 u 27 64 377 8.015 -99970. 17262.6

同期ができれば「remote」列に「*」が表示されると思っています。
何か設定が足りないでしょうか?。
尚、「/vat/log/message」をtailしてますが特にエラーは無さそうです。

よろしくお願いします。

こんにちは。
度々すみません、NTPの設定をしましたがどうも同期が始まりません。

「ntpdate 130.69.251.23」と手動同期は成功します。
しかしntpデーモンを起動し1時間以上放置しても同期されません。
※外部タイムサーバー参照としてます

ntp.confは下記のとおりです。
---------------------------------------------------
server 133.100.9.2 # clock.nc.fukuoka-u.ac.jp
server 130.69.251.23
driftfile /var/lib/ntp/drift
---------------------------------------------------

でntp...続きを読む

Aベストアンサー

#4のqaaqです。

○ntp.conf 関連
server 行に "iburst" を付けておきましょう。
server ntp.nict.jp iburst <--こんな感じになります。

ntp サーバ起動時の時刻調整の収束時間が早くなります。
http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=ntp.conf&dir=jpman-5.4.0%2Fman&sect=0

○ntpdate での時刻調整
ntpdate -b -u [サーバ名] を複数回実行して、"offset の値が0.1以下"になるまで、強制的に時刻調整して下さい。

○ハードウエアclockの修正
hwclock -w コマンドでハードウエアclockを合わせます。
http://www.linux.or.jp/JM/html/util-linux/man8/hwclock.8.html

○ntpdの動作
ntpによる時刻調整は、調整幅が通常128mSと小さいので、1時間は様子をましょう。
2時間程度経過しても、時刻修正の兆候が見られない場合ハードウェアの不良も考えられます。

時刻調整の兆候としては、
・logファイルに 一時間毎に調整したメッセージが書かれる。
Jan 7 21:57:40 ntpd[91145]: offset 0.000994 sec freq -190.802 ppm error 0.000076 poll 8
・ntpq -p の出力の最初の桁に"*,+"が付く。また、reach が377になる。
% ntpq -np
remote refid st t when poll reach delay offset jitter
+192.168.0.102 GPS_NMEA(0) 2 u 3 32 377 0.926 -0.330 0.023
*192.168.0.192 GPS_NMEA(1) 2 u 10 32 377 0.747 -0.336 0.023
192.168.0.9 PPS(1) 2 u 3 32 377 0.757 6.559 0.161


○その他
・PC起動時には、システムクロックを計測してその後の動作の基準にしていますが、
CMOSバッテリ不足やハードウェアに何らかの異常があるととんでもない時刻を示すことがあります。(要修理です)
・BIOSの時計も起動時の初期時刻として使われてしまうので、ある程度合わせておいた方がいいです。

#4のqaaqです。

○ntp.conf 関連
server 行に "iburst" を付けておきましょう。
server ntp.nict.jp iburst <--こんな感じになります。

ntp サーバ起動時の時刻調整の収束時間が早くなります。
http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=ntp.conf&dir=jpman-5.4.0%2Fman&sect=0

○ntpdate での時刻調整
ntpdate -b -u [サーバ名] を複数回実行して、"offset の値が0.1以下"になるまで、強制的に時刻調整して下さい。

○ハードウエアclockの修正
hwclock -w コマンドでハ...続きを読む

Q起動しているサービスを確認するコマンド

初歩的な質問で恐縮ですが、ご教示いただけますと幸いです。

起動しているサービスを確認するために以下の2つのコマンドを打ってみるのですが、結果(出て来るサービス名)が違います。
このコマンドの違いについてご教示いただけますでしょうか。

(1)service --status-all
(2)chkconfig --list

Aベストアンサー

(1)service --status-all

サービスの現在のステータスを調べるコマンド

(2)chkconfig --list

OSのブート時に自動起動するサービスを調べるコマンド

違いが出るのは、
・ブート後に手動あるいは他のコマンドから起動したサービス
・ブート後に手動あるいは他のコマンドから、あるいはエラーで停止したサービス
・ブート後に実行はされるがすぐに停止して常駐しないサービス (ntpdate とか)

あるいは、(1)ではサービス名が表示されない物もあるので、どのサービスがどんなステータス出力をするのか知っておく必要もありますね。(service network statusとか)

Qpingでポートの指定

pingでIPアドレスを指定して、通信できるかどうかというのは
よく使いますが、pingでポートを指定して応答するかどうかは調べられるのでしょうか?

よろしくお願いします

Aベストアンサー

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含むICMP)ではできません。

FTPの疎通確認であれば、クライアントからサーバに対するTCP/21通信(FTP-CMD)が可能であること(サーバからクライアントへのTCP/21からの応答を含む)+サーバからクライアントに対するTCP/20通信(FTP-DATA)が可能であること(クライアントからサーバへのTCP/21からの応答を含む)が必要でしょう。

監視ソフトによるものであれば、
・クライアントからサーバへのログイン(TCP/21)
・クライアントからサーバへのlsの結果(TCP/20)
で確認すればよいでしょう。

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含む...続きを読む

QNTP の TCPポートは?

NTPは123/UDPでようは足りると思うのですが、
WELL KNOWN PORTとかいろいろな資料に「123/TCP」ポートが割当たってます。
ntpd,ntpdate等でNTPを使う場合、実際には123/TCPは使われているのでしょうか?

Aベストアンサー

RFC1305では「ntpには123/udpを割り当てる」となっていますが、RFC1700では「123 ntp」となっており、「123/udp」と明示されているわけではありません。
よって、「123/tcp ntp」が間違っている(または使えない)という明確な根拠にはなりません。

「現状では『123/tcp ntp』を実装するための定義が存在しない」程度に考えた方が良いと思います。

ただ、将来的にRFC2030のSNTPが(IPv6対応などの点で)主流になる可能性があるので、「123/tcp ntp」は定義されない可能性もあります。

Qシェルスクリプトでファイル内の数値文字列を数値として扱うには

失礼します。
シェルスクリプトでファイル内のテキスト(数値文字列)を取得して、それを使って計算するにはどうすれば良いでしょうか?

str:ファイル内のテキスト(数値文字列)

res=$(( $str + 1 ))

・エラー
")syntax error: invalid arithmetic operator (error token is "


よろしくお願いします。

Aベストアンサー

bashをご使用と判断して

res=$(( $str + 1 ))
ではなく、
res=$(( str + 1 ))
だと思います。

> exprもやってみたのですが、処理が遅くなるので使いません。
興味があって以下のシェルで検証してみました。

#!/bin/bash

str=1
i=0

echo 'Using $((str + 1))'
date '+%H:%M:%S.%N'

while [ $i -lt 10000 ]
do
str=$(( str + 1))
i=`expr $i + 1`
done

date '+%H:%M:%S.%N'

exit

$ ./test.sh
Using $((str + 1))
09:18:46.290418000
09:18:56.929345000
これをexprに書き換えたところ
$ ./test2.sh
Using expr
09:19:00.302748000
09:19:19.259990000

exprだと19秒ですが、$(( 演算 )) だと10秒程度なので、演算が多くなれば確かにexprは不利ですね。

bashをご使用と判断して

res=$(( $str + 1 ))
ではなく、
res=$(( str + 1 ))
だと思います。

> exprもやってみたのですが、処理が遅くなるので使いません。
興味があって以下のシェルで検証してみました。

#!/bin/bash

str=1
i=0

echo 'Using $((str + 1))'
date '+%H:%M:%S.%N'

while [ $i -lt 10000 ]
do
str=$(( str + 1))
i=`expr $i + 1`
done

date '+%H:%M:%S.%N'

exit

$ ./test.sh
Using $((str + 1))
09:18:46.290418000
09:18:56.929345000
これをe...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング