1. 시작
한 서버에 여러 데몬 애플리케이션을 설치하고, 이것들을 부팅 시 시작하게끔 해줘야 하는 경우가 생겼다.
https://hbcha0916.tistory.com/category/%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0%20%EA%B5%AC%EC%84%B1
컴퓨터가 어떠한 이유로 재부팅 되었을 경우에 직접 Shell에 접속하여 `xxx.sh start` 명령어를 직접 실행시키기도 번거롭고, 그 명령어를 직접 실행시켜 주기 전까지 서비스가 불가하기 때문에 부팅 시 스크립트를 설정해 줘야 한다.
1.1. 자동 시작 프로그램 목록
부팅 시 자동 시작되어야 하는 프로그램들은 아래와 같다.
- Apache Zookeeper
- Apache Kafka
- Apache NiFi
- ElasticSearch
1.2. 삽질했던 기록
누군가에겐 정말 쉬운 작업이었을 수도 있겠지만 나는 이 작업에 대해 삽질을 했었다.
삽질하면서 알게 된 사실을 아래 적어놓겠다.
- `rc.local`에 작성된 스크립트는 전부 `root` 권한으로 실행된다.
- 이로 인해 위에 모든 애플리케이션이 `root` 계정으로 실행되었고, `root`계정으로 실행되는 동안 생긴 모든 파일들의 소유자는 `root`로 생성되었다.
이 사실을 인지하지 못하고 다시 일반 사용자로 실행했을 때, 애플리케이션이 정상적으로 구동하지 못했고 log파일 또한 쌓이지 않아 몇 시간 동안 삽질했었다.(왜 애플리케이션이 죽었는지 알 수 없었다.) - 그래서 `chown` 명령어로 다시 소유자를 일반 사용자로 변경했더니 정상 가동 되었고,
`su - <일반사용자> -c '<스크립트>'` 명령어로 `rc.local` 에서 일반 사용자로 명령어를 실행하는 방법을 알게 되었다.
- 이로 인해 위에 모든 애플리케이션이 `root` 계정으로 실행되었고, `root`계정으로 실행되는 동안 생긴 모든 파일들의 소유자는 `root`로 생성되었다.
2. `systemctl` 이란?
애플리케이션을 시작 시 실행하기 위해서는 `systemctl` 을 사용해야 하는데, `systemctl`이 뭔지 아래 링크에 잘 나와 있다.
https://www.lesstif.com/system-admin/systemd-system-daemon-systemctl-24445064.html
systemd(system daemon)은 전통적으로 Unix 시스템이 부팅 후에 가장 먼저 생성된 후에 다른 프로세스를 실행하는 init 역할을 대체하는 데몬입니다.
3. `rc.local`
`systemctl` 에서 `rc.local` 이란 서비스를 사용할 것이다.
3.1. `rc.local` 이란?
rc.local 은 부팅 시 자동 명령어 스크립트를 수행하는 서비스이다.
3.2. `rc.local` 파일 생성
Ubuntu 기준으로 `/etc/rc.local` 에 있고, 없으면 생성시켜 준다.
텍스트 에디터로 `/etc/rc.local` 을 열어주고 스크립트를 작성시켜 준다.
#!/bin/bash
<스크립트 작성>
3.2.1. 주의
- `rc.local` 파일 최상단에는 `#!/bin/bash` 구문이 꼭 있어야 한다.
- `rc.local` 파일 내에 있는 모든 스크립트는 `root` 권한으로 수행된다.(`sudo`를 입력할 필요가 없다는 것)
- 그래서 일반 사용자로 실행하길 원할 때는 아래 내용을 참고한다.
- `rc.local` 파일 내에서 애플리케이션 실행 스크립트를 넣어줄 경우에 애플리케이션을 시작할 때 나오는 정보들은 출력되지 않는다.(따로 애플리케이션 내에 있는 log 파일을 뒤져서 찾아야 함)
3.3. 스크립트를 특정 사용자로 실행하는 방법
"3.2.1. 주의"의 2번 내용을 해결하는 방법(다른 사용자로 실행하는 방법)은 아래 문법에 맞게 실행 구문을 입력한다.
su - <유저명> -c '<스크립트1>; <스크립트2>; <스크립트3>..'
3.1.1. 예
su - user01 -c '/runfile/app1/start.sh; /runfile/app2/start.sh'
#or
su - user01 -c '/runfile/app3/start.sh'
여러 개의 명령문을 사용하려면 `;`(세미콜론)으로 구분 짓는다.
3.4. `rc.local` 파일 권한부여
처음 생성한 사용자라면 권한도 부여해 준다.
sudo chmod 755 /etc/rc.local
3.5. `rc-local.service` 파일 수정
`/lib/systemd/system/rc-local.service` 파일 내에 맨 아래구문에 해당 내용을 추가해 준다.
sudo vi /lib/systemd/system/rc-local.service
[Install]
WantedBy=multi-user.target
이렇게 하면 이제 준비는 끝났고 활성화시켜보자
4. 적용
4.1. 데몬 서비스 적용
방금 작성해 준 `rc.local`및 `rc-local.service`을 적용시킨다.
sudo systemctl daemon-reload
4.2. 서비스 활성화(비활성화), 시작(중지), 상태 보기
sudo systemctl enable rc-local
# 활성화
sudo systemctl disable rc-local
# 비활성화
sudo systemctl start rc-local
# 시작
sudo systemctl stop rc-local
# 중지
sudo systemctl status rc-local
# 상태보기
`rc-local` 서비스를 활성화와 시작을 해보고 재부팅 후 정상 실행됐는지 확인해 보자
4.3. 재부팅 후 서비스 확인
ps -ef | grep <애플리케이션 명>
'Linux | PowerShell' 카테고리의 다른 글
[부팅불가 해결]Ubuntu22.04 Nvidia 그래픽 드라이버 제거/설치 및 삽질기 (2) | 2023.11.02 |
---|---|
[Ubuntu] apt upgrade 롤백(취소하기) (2) | 2023.11.01 |
[SSH] ProxyJump 사용방법 (0) | 2023.09.24 |
[Ubuntu] 리눅스 별칭(alias) 사용 (0) | 2023.08.12 |
[PowerShell] 윈도우에서 '.log' 파일 실시간으로 보기 (0) | 2023.05.23 |