예를 들어 다음 스크립트가 있습니다.
...
start(){
echo "Starting..."
su - $ORA_OWNER -c "$ORA_HOME/bin/dbstart $ORA_HOME"
su - $ORA_OWNER -c "$ORA_HOME/bin/emctl start dbconsole"
touch /var/lock/subsys/dbora
}
stop(){
echo "Stopping..."
su - $ORA_OWNER -c "$ORA_HOME/bin/emctl stop dbconsole"
su - $ORA_OWNER -c "$ORA_HOME/bin/dbshut $ORA_HOME"
rm -f /var/lock/subsys/dbora
}
restart(){
stop
start
}
usage(){
echo "usage: $0 {start|stop|restart}"
}
...
이 스크립트를 /etc/init.d 디렉토리에 넣고 S
(start)로 시작하는 파일 이름으로 rc3.d에 링크를 만든 후 Linux는 function 을 사용하는 데 필요한지 어떻게 알 수 있습니까 start()
?
답변1
이 스크립트를 디렉토리에 넣고 (start) 로 시작하는 파일 이름으로
/etc/init.d
링크를 만든 후 Linux는 function을 사용하는 데 필요한지 어떻게 알 수 있습니까 ?rc3.d
S
start()
나는 그렇게 생각하지 않습니다. 함수는 스크립트 내부에 있으며 스크립트는 함수 자체를 호출해야 합니다.
해당 초기화 스크립트를 둘러싼 다른 스캐폴딩은 수행할 작업을 알려주는 인수를 사용하여 start
호출 stop
합니다 restart
. 링크( K*
및 S*
)의 이름은 스크립트를 실행하는 순서와 시작 또는 중지를 지시해야 하는지를 알려줍니다. 물론 systemd는 작업을 약간 다르게 수행하지만 올바르게 이해하면 여전히 그런 init 스크립트를 지원할 수 있으므로 실행할 때 올바른 인수를 전달해야 합니다.
그러면 init 스크립트에서 다음과 같은 내용을 볼 수 있습니다.
do_start() {
something here...
}
do_stop() {
something else here...
}
case $1 in
start)
do_start;;
stop)
do_stop;;
restart)
do_stop;
do_start;;
*)
usage;;
esac
하단 case
에서는 첫 번째 인수가 무엇인지 확인하고 이를 기반으로 작동합니다. 그것이 당신의 스니펫에서 누락된 부분입니다.
새로운 init 스크립트를 작성하는 경우 대신 시스템 서비스로 구현하는 것을 고려해야 합니다.
답변2
(리눅스)는 그렇지 않습니다. 리눅스는 커널이다. Gnu/Linux 운영 체제는 알고 있습니다.
특히 init
프로세스는 알고 있습니다. 스크립트에는 , , init
가 있어야 합니다 . 이러한 메서드에는 미리 정의된 의미가 있으며 적절한 시점에 호출됩니다. 이러한 메소드는 스크립트에 대한 인터페이스이므로 구현해야 합니다.start
stop
restart
답변3
"S" 때문에 링크를 시작했습니다. 링크가 "K"(kill에서 유래)로 시작하면 중지 기능이 실행됩니다.