# 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 버전확인
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}
- 마지막으로 서비스 접속을 해보면 정상적으로 접속이 되는것을 확인 할 수 있다.
- 끝 -
'🌅 리눅스 > 💻 Amazon linux & Corretto' 카테고리의 다른 글
Amazon Linux 2 버전확인 (0) | 2023.07.17 |
---|