Linux 에서 스 크 립 트 를 작성 하여 Daemon 을 실현 합 니 다.
이상 은 넓 은 의미 의 Service 의 정의 입 니 다.Linux 의 서 비 스 는 일반적으로/etc/init. d 폴 더 아래 에 놓 여 있 습 니 다.이 폴 더 에 있 는 파일 을 찾 아 보면 Linux 에서 Service 를 작성 하 는 데 일반적으로 따 르 는 원칙 을 발견 할 수 있 습 니 다.
Linux 에서 Service 를 작성 하 는 것 은 일반적으로 따 르 는 원칙 입 니 다.
1) 실제 실행 되 는 서 비 스 는 일반적으로 어떤 빈 디 렉 터 리 아래 (/bin,/usr/bin, etc) 에 놓 여 있다.
2)/etc/init. d 폴 더 아래 는 보통 셸 스 크 립 트 로 빈 디 렉 터 리 의 서 비 스 를 제어 합 니 다.
3)/etc/init. d 폴 더 의 셸 스 크 립 트 는 보통 두 개의 인자, start 와 stop 를 받 습 니 다.status, reload, restart 등 자주 사용 되 는 추가 매개 변수 도 있 습 니 다.
4)/etc/init. d 폴 더 에 있 는 셸 스 크 립 트 는 최소한 두 줄 의 설명 을 포함 합 니 다. 한 줄 은 chkconfig 에 게 이 서비스 가 실행 되 는 runlevel 을 알려 주 고 우선 순 위 를 시작 하 며 우선 순 위 를 끝 냅 니 다.이 서비스 에 대한 설명 을 chkconfig 에 알려 줍 니 다.
Linux 시작 과정 과 RunLevel
리 눅 스 의 시작 과정 과 RunLevel 을 이해 하려 면 먼저/etc/inittab 파일 을 탐색 할 수 있 습 니 다./etc/inittab 에서 다음 7 가지 RunLevel 을 정의 합 니 다.모든 서 비 스 는 자신 이 어느 RunLevel 에서 실행 하 는 지 설정 할 수 있 습 니 다./sbin/init 를 호출 하여 해당 하 는 RunLevel 에 들 어 갈 수 있 습 니 다. 예 를 들 어/sbin/init 6 를 실행 하면 시스템 이 다시 시 작 됩 니 다.어떤 RunLevel 에서 서비스 가 시작 되 지 않 아 시스템 시작 에 실 패 했 을 경우 이 서 비 스 를 설정 하지 않 은 RunLevel 에 들 어가 서 이 서 비 스 를 사용 하지 않 거나 수정 할 수 있 습 니 다 (Windows 와 유사 한 보안 모드).
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
/etc/inittab 파일 에 서 는 결 성 RunLevel 도 정의 합 니 다.다음은 결 성 을 대표 하 는 RunLevel 은 5 입 니 다.
id:5:initdefault:
/etc 폴 더 에서 ls - d rc * 를 실행 하면 다음 파일 과 디 렉 터 리 를 보 여 줍 니 다.
rc rc0.d rc1.d rc2.d rc3.d rc4.d rc5.d rc6.d rc.d rc.local rc.sysinit
rc 는 스 크 립 트 입 니 다./etc/inittab 에서 RunLevel 에 따라 rc 를 실행 합 니 다.rc 스 크 립 트 는 해당 rcN. d 에 가서 다음 스 크 립 트 를 실행 합 니 다.rc. local 은 마지막 으로 호출 된 스 크 립 트 입 니 다. 사용자 정의 작업 을 넣 을 수 있 습 니 다.
rcN. d 폴 더 에 들 어가 면 S 와 K 로 시작 하 는 스 크 립 트 의 링크 를 발견 할 수 있 습 니 다. S 와 K 뒤에 2 자리 숫자 가 있 습 니 다.그 중에서 S 는 Start 를 대표 하고 K 는 Kill 을 대표 한다.S 시작 스 크 립 트 는 rc 에서 호출 할 때 start 인 자 를 가 져 옵 니 다.K 시작 스 크 립 트 는 rc 에서 호출 할 때 stop 인 자 를 가 져 옵 니 다.S 와 K 뒤에 달 린 2 자리 숫자 는 서비스의 우선 순 위 를 나타 내 며 숫자 가 클 수록 나중에 실행 된다.이 스 크 립 트 의 링크 의 목적 지 는 대부분/etc/init. d 폴 더 아래 에 있 습 니 다.
이제 모든 것 이 분명 해 졌 다.저 희 는 해당 rcN. d 폴 더 에서 정 해진 규범 에 따라/etc/init. d 스 크 립 트 의 소프트 링크 를 만 드 는 방식 으로 시스템 시작 과 종료 시 서비스의 시작 과 끝 을 제어 할 수 있 습 니 다.그러나 수 동 으로 소프트 링크 를 만들어 관리 하 는 것 은 불편 하기 때문에 RedHatLinux 는 chkconfig 를 제공 하여 이 소프트 링크 를 만 드 는 데 도움 을 주 었 습 니 다./etc/init. d 에 놓 인 서비스 제어 스 크 립 트 가 앞에서 언급 한 chkconfig 의 약속 에 부합 하기 만 하면 됩 니 다. 화해시키다 description), chkconfig -- add 를 사용 할 수 있 습 니 다. chkconfig -- list chkconfig -- del 등 명령 으로 서비스의 시작 여 부 를 제어 합 니 다.
하나의 예
다음은 c++ 언어 로 쓴 Service 입 니 다. 이 서 비 스 는/tmp/random 파일 에서 5 초 마다 4 개의 무 작위 숫자 를 생 성 합 니 다.g++ o my rand my rand. cpp 를 통 해 컴 파일 합 니 다.그리고 myrand 를/root/bin/폴 더 아래 에 놓 으 세 요.
myrand.cpp
/* myrand.cpp
* this program read 4 chars from /dev/random in each iteration,
* and then adjust it to 0-9. Finally the 4 chars are written
* to /tmp/random. This is only for testing /dev/random, and
* at the same time serve as a example service.
*/
#include
#include
using namespace std;
#include
int main()
{
while (true)
{
ifstream ifile("/dev/random");
char ch;
char str[5];
str[4]=0;
int i;
for(i=0;i<4;i++)
{
ifile >> ch;
if(ch<0) ch=-ch;
ch = ch % 10;
ch='0' + ch;
str[i]=ch;
}
ofstream ofile("/tmp/random");
ofile << str << endl;
sleep(5);
}
}
다음은 스 크 립 트 입 니 다. 이름 은 my randservice 입 니 다./etc/init. d 폴 더 아래 에 두 십시오.
#!/bin/sh
#
# chkconfig: 2345 80 50
# description: myrandservice is for testing how to write service in Linux
#
# processname: myrandservice
#
# Source function library.
. /etc/rc.d/init.d/functions
ret=0
start() {
# check fdb status
echo "start myrandservice"
daemon /root/bin/myrand &
ret=$?
}
stop() {
echo "stop myrandservice"
kill -9 $(ps -ef | grep myrand | grep -v grep | awk '{print $2}')
ret=$?
}
status() {
local result
echo "check status of myrandservice..."
#lines=$( ps -ef | grep myrand | grep -v grep | )
#echo $lines
result=$( ps -ef | grep myrand | grep -v myrandservice | grep -v grep | wc -l )
#echo $result
if [ $result -gt 0 ] ; then
echo "my randservice is up"
ret=0
else
echo "my randservice is down"
ret=1
fi
echo "check status of myrandservice...done."
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status
;;
*)
echo {1}quot;Usage: $0 {start|stop|status}"
exit 1
esac
exit $ret
예 설명
예 에서 스 크 립 트 의 아래 두 줄 은 chkconfig 에 사 용 됩 니 다.그 중에서 2345 는 이 서비스 가 RunLevel 2, 3, 4, 5 에서 열 린 다 는 것 을 의미한다.80 은 시작 우선 순위 입 니 다.50 대표 종료 우선 순위.RunLevel 에 값 을 추가 하지 않 고 "-"로 대체 하면 이 서 비 스 는 어떠한 runlevel 에서 도 자동 으로 시작 되 지 않 고 수 동 으로 시작 해 야 한 다 는 뜻 입 니 다.서비스 start/stop/status 등 을 통 해 서 비 스 를 제어 하거나 조회 할 수 있 습 니 다.
# chkconfig: 2345 80 50
# description: myrandservice is for testing how to write service in Linux
스 크 립 트 의 daemon 함 수 는/etc/rc. d/init. d/functions 에 존재 합 니 다.daemon 은/dev/null 로 출력 할 지, coredump 파일 생 성 여 부 를 설정 합 니 다.daemon 을 통 해 시 작 된 프로그램 은 사용자 가 명령 행 셸 을 종료 하 더 라 도 Service 가 실행 되 고 종료 되 지 않 을 것 을 보증 합 니 다./etc/rc. d/init. d/functions 에는 killproc, status 등 다른 유용 한 함수 도 포함 되 어 있 으 며, 각각 서 비 스 를 죽 이 고 서비스 상 태 를 볼 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Linux 운영 기초 기능: 스 크 립 트 프로 그래 밍 과 Linux 명령$와 $@ 의 차이 $와 $@ 은 함수 나 스 크 립 트 에 전 달 된 모든 인 자 를 표시 합 니 다. 작은 따옴표 (") 에 포함 되 지 않 을 때"$1 ","$2 ","$n "형식 으로 모든 인 자 를 출력 합...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.