Linux環境でカスタムプログラムを起動してから起動する方法

4136 ワード

Linuxの下にある自分で書いたアプリケーションを起動させるには、2つの方法があります.
方法1:スクリプト/etc/rcを起動する.local起動コマンドの追加
テストとして、まずテストプログラムを書くことができます.
#include

int main()
{
	printf("Test start!
"); return 0; }

次にコンパイル生成Testを行い、その経路は/home/Testである.root権限の下でrc.localファイルに実行コマンドを書き込み、以下のように変更します.
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
/home/Test>/dev/null 2>&1 &

exit 0

システムが再起動すると、Testが起動し、バックグラウンドで実行されます.
/home/Testは、この実行可能プログラムを実行することを示す.
>/dev/nullは、プログラムの標準出力を/dev/nullにリダイレクトすることを示し、/dev/nullは空のデバイスであり、書き込まれたデータはすべて破棄されます.
2>&1は、標準エラーを標準出力にリダイレクトすることを示し、2と1は、実際にはファイル記述子ですが、1の前に&があり、&を付けなければ、1はファイル名とみなされます.
&このプログラムがバックグラウンドで実行されていることを示します.
方法2:プログラムをサービスとして登録する
Linuxシステムには7つの異なる実行レベル、すなわち0~6、7つの実行レベルがあり、コマンドrunlevelで現在のシステムの実行レベルを表示することができます.
しかし、異なるLinuxのシステム実行レベルの定義は異なり、ここでは主にDebianとRedhatシリーズの違いであり、UbuntuはDebianに基づいており、CentOSはRedhatに基づいている.
debianのrunlevelレベル定義は、0:Halt,シャットダウンモード1:Single,シングルユーザモード2:Full multi-user with display manager(GUI)3:Full multi-user with display manager(GUI)4:Full multi-user with display manager(GUI)5:Full multi-user with display manager(GUI)6:Reboot,Ubuntuのデフォルトの起動を再起動するrunlevelは2ですが、runlevel 2~5は同じ、つまりマルチユーザグラフィックモードで動作していることがわかります.これはRedhatシリーズとは違います.redhatのrunlevelレベルは、0:システムのダウンタイム状態、システムのデフォルトの実行レベルを0に設定できません.そうしないと、正常に起動できず、マシンが閉じます.1:単一ユーザーの動作状態、root権限、システムのメンテナンスに使用し、Windowsの下のセキュリティモードのログインのようにリモートログインを禁止します.2:マルチユーザ状態、NFSサポートなし.3:完全なマルチユーザーモード、NFSがあり、ログイン後コンソールコマンドラインモードに入る.4:システムは使用されていません.一般的には使用されません.特別な場合には使用できます.例えば、ノートパソコンのバッテリーが切れたときに、このモードに切り替えて設定することができます.5:X 11コンソール、ログイン後グラフィックGUIモード、XWindowシステムに入ります.6:システムが正常にシャットダウンされ、再起動されます.デフォルトの動作レベルは6に設定できません.そうしないと、正常に起動できません.Init 6マシンを運転すると再起動します.
Redhatシリーズのrunlevel 2~5の区分はより詳細で、Redhatシリーズの起動レベルは一般的にrunlevel 3またはrunlevel 5であり、コマンドラインモード起動運転とグラフィックインタフェースモード起動運転をそれぞれ示すことを強調したい.
ステップ1:サービススクリプトの作成
スクリプトのファイル名は、プログラム名と一致します.
#!/bin/bash

ProgramPath=/home/Test
ARG=$1


FunStart(){                         #       

if [ -e $ProgramPath ];then         #           
	pid=$(pidof ${ProgramPath}) #            
	expr $pid + 0 >/dev/null
	if [ $? -eq 0 ] && [ $pid -gt 0 ];then 
			echo "StartMain process already exists."
			exit 0		
	fi
	nohup $ProgramPath > /dev/null 2>&1 &  #    
else
	echo $CollectorManger is not exists.
fi

}


FunStop(){                          #       
pid=$(pidof ${ProgramPath})         #       PID
expr $pid + 0 >/dev/null           #     PID     ,    0
if [ $? -eq 0 ] && [ $pid -gt 0 ];then
	kill -9 $pid >/dev/null         #     
fi

}


#                  
case $ARG in
start):                            #  
FunStart

;;

stop):                             #  
FunStop

;;

restart):                          #  
FunStop
FunStart

esac

ステップ2:サービスの登録
root権限の下で、スクリプトを/etc/initにコピーします.d下.
service StartMain start
servive StartMain stop
service StartMain restart
Testプログラムの起動、停止、再起動をそれぞれ完了できます.注意、権限が足りないので、sudoを追加します.
ステップ3:サービス加入開始項目
いくつかのソフトリンクを作成し、それぞれ次のことを行います.
sudo ln -s  /etc/init.d/Test     /etc/rc0.d/K100Test
sudo ln -s  /etc/init.d/Test     /etc/rc2.d/S100Test
sudo ln -s  /etc/init.d/Test     /etc/rc3.d/S100Test
sudo ln -s  /etc/init.d/Test     /etc/rc5.d/S100Test
これで起動項目の追加が完了し、プログラムは機会を開いてプログラムを起動し、シャットダウンするとプログラムを停止します.Ubuntuでは前の2つのリンクを作成するだけでよいが,後の2つのリンクはRedhatシリーズと互換性を持つためである.システムが0,2,3,5レベルで実行すると、対応するディレクトリのスクリプトである/etc/rc 0が実行されます.d,/etc/rc2.d/,/ect/rc3.d,/etc/rc5.dディレクトリの下のスクリプト.
ソフトリンクのネーミングはすべてKまたはS+デジタル+サービススクリプト名であり、Kはkill、すなわちstop、実行/etc/initを表す.d/Testの場合、入力パラメータstop、Sはstartを、入力パラメータstartを、中間の数字はrcnであるため実行順序を表す.dディレクトリの下には、このようなリンクがたくさんあるため、中間の数字がスクリプトの実行順序を決定し、数字が小さいほど先に実行され、一部のプログラム間に依存関係があるため、順序が重要である.