본문 바로가기

🌅 리눅스/💻 Amazon linux & Corretto

AmazonLinux에서 Shellscript 자동으로 시작하기

728x90
반응형

# AmazonLinux에서 Shellscript 자동으로 시작하기

- systemctl에 프로세스를 자동으로 실행 시키기 위해 여러가지 방법을 알아보다가.

아래의 명령어로 실행이 가능하다고 하여 실행을 했다.

역시 오류도 함께 송출 하였다...

DESKTOP-BUANL37:~$ sudo docker run --privileged --name pinpoint-01 may9noy/correcto-pinpoint /sbin/init
docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "/sbin/init": stat /sbin/init: no such file or directory: unknown.
ERRO[0000] error waiting for container:

에러 내용은 /sbin/init을 찾을 수 없다는 내용이다.

내가 사용하는 OS 버전은 Amazonlinux로 아마존에서 제공하는 OS이다. 해당 OS의 정보와 커널을 확인하면 아래와 같다.

2023.07.17 - [🌅 리눅스/💻 Amazon linux & Corretto] - Amazon Linux 2 버전확인

 

Amazon Linux 2 버전확인

# Amazon Linux 버전 확인하기 1. 아마존 리눅스 버전확인 - 명령어는 아래와 같다. grep . /etc/*-release - 명령어를 확인하면 아래와 같은 결과값을 볼 수 있다. bash-4.2# grep . /etc/*-release /etc/os-release:NAME="Am

may9noy.tistory.com

1. init을 설치하자

- /sbin/init 파일을 생성하기 위해 아래의 명령어를 통해 설치를 진행한다.

yum install initscripts

위의 명령어로 설치가 완료되면 /sbin/init 파일이 생성이 되어 있을 것이다.

- 수정한 내용을 이미지로 저장한다.

docker commit [container ID] [Image Name]

2. privileged 모드로 접근 하기

아래의 명령어로 docker 이미지에 privileged 모드로 접근한다.

sudo docker run --privileged -d --name {custom_name} {docker_image_name} /sbin/init

3. rc-local.service 내용 추가

vi 편집기를 통해서  /usr/lib/systemd/system/rc-local.service 파일을 연 다음 하단에 아래 내용을 추가 한다.

파일 맨 마지막단에 아래의 내용을 추가한다.

[Install]
WantedBy=multi-user.target

4. rc.local 파일 생성

/etc/rc.d/rc.local 파일을 생성한뒤 실행할 명령어를 작성한다.

작성할 내용은 아래와 같다.

#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.

touch /var/lock/subsys/local
/etc/init.d/script_start.sh restart
# 여기에 실행하고자 하는 스크립트 location 주소를 입력한다.
/etc/init.d/script_start.sh restart

- /etc/init.d/script_start.sh 파일의 권한을 755로 설정한다. (chmod 755 script_start.sh)

- script_start.sh의 내용은 아래와 같다.

cd /home/ec2-user/hbase-1.2.7/bin

sh start-hbase.sh

nohup java -jar -Dpinpoint.zookeeper.address=localhost collector-boot-2.2.0.jar 1>/dev/null 2>&1 &

nohup java -jar -Dpinpoint.zookeeper.address=localhost web-boot-2.2.0.jar 1>/dev/null 2>&1 &

cd /home/tomcat/apache-tomcat-9.0.76/bin

sh startup.sh

5. rc.local 파일 실행 권한 설정 

chmod 755 /etc/rc.d/rc.local

6. systemctl enable rc-local.service 명령을 실행

systemctl enable rc-local.service

7. systemctl start rc-local.service 명령을 실행

systemctl start rc-local.service

- 오류발생 : 아래와 같은 오류가 발생 했을때, 내용을 차근차근 보고 해결을 해야한다.

보통은 journalctl -xe 명령어를 통해 어떤 문제가 있는지 확인을 해야한다.

bash-4.2# systemctl start rc-local.service
Job for rc-local.service failed because the control process exited with error code. See "systemctl status rc-local.service" and "journalctl -xe" for details.
bash-4.2#

journalctl -xe 명령어를 실행 후 차근차근 위의 내용을 보면 에러내용을 확인 할 수있고, 해당 오류를 해결하고 다시 실행하면 정상적인 실행상태가 된다. 아래의 명령어 처럼 systemctl daemon-reload를 입력하면 변경내용을 바로 반영할 수 있다.

systemctl daemon-reload

- 상태확인, 서비스가 정상적으로 실행되고 있는 모습이다.

bash-4.2# systemctl status rc-local.service
● rc-local.service - /etc/rc.d/rc.local Compatibility
   Loaded: loaded (/usr/lib/systemd/system/rc-local.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2023-07-18 01:37:54 UTC; 7min ago
   CGroup: /docker/a892287312cc2d20698a9d36fb35dfe746074d7cbbb5a162e3ce8d46696fd2fa/system.slice/rc-local.service

Jul 18 01:37:54 a892287312cc systemd[1]: Started /etc/rc.d/rc.local Compatibility.
Jul 18 01:37:54 a892287312cc systemd[1]: Watching 257 through watch_pids1.
Jul 18 01:37:54 a892287312cc systemd[1]: Watching 258 through watch_pids1.
Jul 18 01:37:54 a892287312cc systemd[1]: Watching 273 through watch_pids1.
Jul 18 01:37:54 a892287312cc systemd[1]: Child 273 belongs to rc-local.service
Jul 18 01:37:54 a892287312cc systemd[1]: Unwatching 273.
Jul 18 01:37:54 a892287312cc systemd[1]: Watching 257 through watch_pids1.
Jul 18 01:37:54 a892287312cc systemd[1]: Watching 258 through watch_pids1.
Jul 18 01:44:21 a892287312cc systemd[1]: Unwatching 258.
Jul 18 01:44:21 a892287312cc systemd[1]: Unwatching 257.

8. docker 이미지를 재 시작 후 스크립트가 정상적으로 실행 되었는지 확인하기

- docker이미지를 stop 후 start로 재시작한다.

- 재시작 후 ps-ef 명령어를 통해 스크립트가 정상적으로 실행 되었는지 확인한다.

bash-4.2# ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0 01:37 ?        00:00:00 /sbin/init
root          25       1  0 01:37 ?        00:00:00 /usr/lib/systemd/systemd-journald
root          28       1  0 01:37 ?        00:00:00 /usr/lib/systemd/systemd-udevd
dbus          60       1  0 01:37 ?        00:00:00 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-a
root          71       1  0 01:37 ?        00:00:00 /usr/lib/systemd/systemd-logind
root         257       1  4 01:37 ?        00:00:46 java -jar -Dpinpoint.zookeeper.address=localhost collector-boot-2.2.0.ja
root         258       1  6 01:37 ?        00:01:00 java -jar -Dpinpoint.zookeeper.address=localhost boot-2.2.0.jar
root        1062       0  0 01:38 pts/0    00:00:00 /bin/bash
root        1132       1  0 01:39 tty1     00:00:00 /sbin/agetty --noclear tty1 linux
root        1567    1062  0 01:54 pts/0    00:00:00 ps -ef

- 위의 화면처럼 주키퍼가 정상적으로 실행 된것을 확인 할 수 있다.

9 이제 이미지를 commit하여 업데이트 후 실행을 해보자.

# 실행중인 docker image 중지
sudo docker stop {docker_container_id}

# 중지한 docker image commit (update)
sudo docker commit {custom_name} {docker_container_id}

# update한 docker image 실행
sudo docker container run --name {custom_name} -d -p 8080:8080 {run_container_name}

- 마지막으로 서비스 접속을 해보면 정상적으로 접속이 되는것을 확인 할 수 있다.

 

- 끝 -

728x90
반응형

'🌅 리눅스 > 💻 Amazon linux & Corretto' 카테고리의 다른 글

Amazon Linux 2 버전확인  (0) 2023.07.17