Linux 의 init 시스템: systemd 와 systemctl 간단 사용법


대부분의 리눅스 시스템에서는 다양한 프로세스를 Service 라는 이름으로 띄울 수 있는 systemd 라는 init system 과
그리고 이를 관리하기위한 도구인 systemctl 을 가지고 있다.

이 포스팅에서는 !!! 이게 뭐하는 건지, 어떻게 사용하는지 간단하게 알아본다


영어 잘하는분은 제가 참고한 원서를 참고하시기 바랍니당 ㅎㅎㅎ

<정의를 먼저 살펴보자>

systemd : 일부 리눅스 배포판에서 유닉스 시스템 V나 BSD init 시스템 대신 사용자 공간을 부트스트래핑하고 최종적으로 모든 프로세스들을 관리하는 init 시스템이다. systemd라는 이름 뒤에 추가된 d는 유닉스에서의 데몬(daemon)을 나타낸다. GNU LGPL 버전 2.1 이상으로 허가된 자유 및 오픈 소스 소프트웨어로 출시되었다. systemd의 기본 목표들 가운데 하나는 모든 배포판들에 대하여 기본 리눅스 구성과 서비스 동작을 통일하는 것이다.
2015년을 기준으로 수많은 리눅스 배포판들은 systemd를 자신들의 기본 init 시스템으로 채택하고 있다. systemd의 채택이 증가되어 기능이 복잡해졌을뿐 아니라 배포판들이 채택을 강요받게 되면서 소프트웨어가 유닉스 철학을 위반했다는 비평을 받기에 이르렀다.

systemctl : 리눅스의 systemd 와 service manager 를 컨트롤 하기위한 도구. 서비스의 상태 진단, 설정변경, 구동과 중단 등의 전반적인 관리 기능을 제공한다.

===============================================================

<단일 서비스의 구동/중단, Enable/Disable, Reload>

서비스를 구동하고 멈추는 명령어, 서비스 설정 다시 읽어오는 등의 명령어를 정리하였다. 매우 심플하다.

서비스 enable 과 disable 이라는 개념이 있는데, 여기서 서비스를 enable 했다는 것은 특정 프로그램을 최초 시스템(서버 혹은 PC)가 부팅된 후에 자동으로 시작할지 여부를 결정하는 것이다. (컴퓨터를 켜면 자동실행 옵션 같은거라고 생각하면 됨)



서비스 구동
sudo systemctl start application.service
sudo systemctl start application

서비스 정지
sudo systemctl stop application.service

재시작
sudo systemctl restart application.service

설정 다시 불러오기
sudo systemctl reload application.service

재시작 + 설정 리로드
sudo systemctl reload-or-restart application.service

서비스 Enable 하고 Disable 하기 (= 최초 구동시 자동실행 여부 결정)
sudo systemctl enable application.service
sudo systemctl disable application.service

특정 서비스 Mask (완전이 구동 불가능한 상태) 하기
sudo systemctl mask nginx.service  # 마스크 적용
sudo systemctl unmask nginx.service  # 마스크 해제



<단일 서비스의 점검 및 Unit file 설정>

Service 는 Unit File 이라는 것으로 설정을 가지고 있다.
그래서 Service 를 관리하기 위해서는 Unit file의 사용법을 기본적으로 알아야 한다.



서비스 상태 표시
systemctl status application.service

서비스의 Unit File 표시
systemctl cat atd.service

서비스의 의존성 표시
systemctl list-dependencies sshd.service

서비스 Unit File 의 설정 상태 표시
systemctl show sshd.service

서비스 Unit File 편집
sudo systemctl edit nginx.service  # override.conf 를 만들어서 기존 설정값 덮어쓰기
sudo systemctl edit --full nginx.service  # 현재 설정파일을 직접 변경


# override 한 설정파일 삭제 

/etc/... 에 없으면 /lib/... 에 있을거임
sudo rm -r /etc/systemd/system/nginx.service.d  

# 편집한 설정파일 반영
sudo systemctl daemon-reload  


<System 상태 점검>

모든 서비스를 대상으로 상태를 고루 점검하고 싶을때 사용하는 명령어들을 모아보았다.


모든 Unit 목록 보기
systemctl list-units  # Active 한 것들만 보기
systemctl list-units --all  # 전체 조회
systemctl list-units --all --state=inactive  # Inactive 한 것들만 보기
systemctl list-units --type=service  # Service 만 보기
systemctl list-unit-files  # 모든 Unit File 보기

- 끝 -


[자료구조] Hash Table 의 hash collision 과 Worst Case Lookup Time

해시 테이블은 Key,Value 형태로 데이터를 저장하는 자료구조이다.

저장시에 입력받은 Key 는 Hash Function 을 거쳐 Hashed Value가 되고,
이를 고유 키값으로삼아 Hash table 은  최종적으로 해당 Value 를 저장한다.

일반적인 경우, Hash Table 에서 특정 Key를 찾아내는 시간복잡도(Lookup Time Complexity) 는 O(1) 이다.

그러나, 최악의 경우 Hash Table에 넣고자 하는 데이터의 Hashed Key Collision 현상이 연속적으로 발생하면

아래 이미지의 152번 bucket 과 같이 linked list 형식으로 이루어진 내부 자료구조를 O(N) 시간복잡도를 가지고 탐색해야 원하는 데이터를 얻을 수 있다.
끝 !!


[Linux] systemd 를 이용하여 pyenv + virtualenv + uwsgi 구동하기 개발 삽질이야기

간단히 현재 상태를 이야기 한다면.
nginx -> uwsgi 웹서버 -> Django App
이 되겠다.

최근에 Django App 의 Python 과 Django 버전을 각각
Python 3.4.3 -> 3.6.4
Django 1.8 -> 1.11

으로 올리게 되어, 배포 루틴을 손을좀 보고있었다.

기존에 파이썬 버전관리는 pyenv 로 하고있고
주로 uwsgi 를 구동하는 법은 sudo service uwsgi restart 를 이용하였는데.

- pyenv 를 이용하여 새로운 가상환경 생성 및 pip 라이브러리 설치
- uwsgi.ini 파일 세팅
- Django application 의 신규 버전대응작업
.
.
.
을 마쳤는데 서버가 안켜지는 긔라...
일단 uwsgi.ini 파일은 아래와 같이 세팅함.

그런데 자꾸, 구동할때 pip 라이브러리 ImportModule Error 가 나면서,
Django App 이 uWSGI 서버에 올라가질 않는것이다...

============================================================

문제는!!! systemd 의 uwsgi.service 설정 이었다.

서버에서 아래명령어를 쳐보자
$ sudo vi /lib/systemd/system/uwsgi.service

그러면 아래와 같은 부분이 보일것이다.

ExecStart=/usr/sbin/uwsgi --ini /etc/uwsgi.ini

이는 OS 기본 설치프로그램으로 설치한 uwsgi 실행파일을 바라보도록 되어있는 것이므로
가상환경의 pip 모듈로 설치한 uwsgi 를 바라보도록 아래와 같이 변경한다.

============================================================

1. 특정 pyenv 가상환경 uwsgi 를 바라보도록 할 symbolic link 생성

$ ln -s ~/.pyenv/versions/${TARGET_VERSION}/bin/uwsgi

여기서 TARGET_VERSION 부분을 자신이 사용하길 원하는 pyenv 가상환경명으로 지정하면 되시겟다~


2. 이 심볼릭 링크로 systemd 가 서비스 구동을 하도록 uwsgi.service 파일 설정 변경
$ sudo vi /lib/systemd/system/uwsgi.service

...
# ExecStart=/usr/sbin/uwsgi --ini /etc/uwsgi.ini
ExecStart=/home/silva/.pyenv/uwsgi --ini /etc/uwsgi.ini
...

저장후
$ sudo systemctl daemon-reload

============================================================

이렇게 하고나서
$ sudo systemctl show uwsgi | grep ExecStart=
를 해보면 내가 변경한 서비스 설정이 제대로 적용되었는지 확인할 수 있다.

그럼 uwsgi 를 다시 구동해보자
$ sudo service uwsgi restart

로그확인
$ sudo vi /var/log/uwsgi/uwsgi.log

로그에 아래와 같은 부분이 보이면 성공이다

Python version: 3.6.4 (default, Mar 20 2018, 15:12:39)  [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]
PEP 405 virtualenv detected: /home/deploy/.pyenv/versions/py36
Set PythonHome to /home/deploy/.pyenv/versions/py36

- 끝 -



[Git] 잘못된 머지 커밋 되돌리기: Revert Wrong Merge Commit 개발 이것저것

방법은 아주 간단하다.
문제가 발생한 브랜치를 checkout 한 다음에 아래 명령어를 순차적으로 입력한다.

local 에서 먼저 revert 한다음에 커밋,
그리고 해당내용을 remote 로 푸시 하는 명령어이다.

git revert -m 1 <commit-hash> 
git commit -m "Reverting the last commit which messed the repo."
git push -u origin master

그런데 revert 할때 주의할점이 있다.

먼저 예제 상황....
1. 현재 A 브랜치에 있다
2. A branch 에서 최근에 커밋한 sha1 를 revert 했다
3. 나~~중에 B branch 로 A branch 를 머지 하였다.
-------------- 이떄 B 의 상태는?!?!?!

이때 B 의 상태는 A 의 revert 된 변경사항까지 같이 적용이 된다.
즉, A에서 merge 할때 새로이 추가된 파일이나 변경사항들이 revert를 하면서
"삭제 커밋" 으로 남아있기때문에 !!!

A를 머지한 B 도 그 삭제 커밋의 영향을 받는것이다.
그래서~~~ Merge 커밋을 Revert 하는것은 꽤나 위험한 일이드아...


[결혼준비 후기] 스드메 + 결혼식 + 신혼여행 + 혼수 까지의 모든 지출&비용 정리 양파개발자

안녕하세요~!

오늘은 개발 관련 포스팅이  아닌 !!! 제 이야기를 좀 하고자 합니다.
내용도 나름 조금 실용적이고 많은 분들이 흥미로워 하실만한 걸로 준비했어요.ㅋ

저는 2017.6.17 에 결혼을 하였는데요,
결혼을 준비하면서 참 .... 돈쓸일이 많았죠,
개인적으로 쓸데없는 소비하는걸 굉장히 싫어해서 무지 철저히 정리했습니다 ㅋㅋ
모든 결정을 아내와 함께 어떻게 하면 좋을지 많은 고민을 했지요,,,, (싸우기도 많이 했...)

어쨋든 이 모든것이 끝난 지금,,,
나름 2천만원 초반대로 이 모든걸 이루어(?) 내었다는 것이 꽤 잘한편이 아닌가 하는 생각이 듭니다. 
하.하.하...

그냥 버릴수도 있는 데이터 이지만...
혹여 결혼을 준비하시는 분들에게 조금이나마 도움이 될까 하여..
제가 그 당시 정말 정성스럽게 작성하였던,, 지출 도표를!!
아내의 허락을 받고 공개합니다 !!! ㅎㅎ

지출항목지출항목 설명가격
스드메 패키지from 웨덱스웨딩
스튜디오-ST정우
드레스-후보3개중 최저가 기준
메이크업-히엘
₩1,230,000
ST정우 추가금from 웨덱스웨딩₩200,000
드레스 투어
피팅비
샵마다 3만씩 세군대 돌았음
그중 하나는 결정하면 면제
₩60,000
드레스샵 추가금from 레이첼웨딩₩100,000
웨딩 촬영
원본 데이터 CD
from 스튜디오
25만원 부터
₩253,000
부케from 웨덱스웨딩
(패키지포함)
₩0
헬퍼비
(드레스샵)
웨딩촬영 & 본식
각 15만원
₩300,000
웨딩홀 대관료더모스트 웨딩홀
식사 보증인원 250이상 시 무료
₩0
본식 스냅 촬영사계절(봄)
by 웨딩플레너소개
₩450,000
본식 혼주 메이크업장모님, 시어머니, 시누이 3명
from 웨딩홀 (인당 15만)
₩450,000
폐백 음식기본세트,,, from 웨딩홀₩200,000
폐백 의상 준비
= 한복 대여료
이미옥 한복₩400,000
폐백 수모비from 웨딩홀₩70,000
청첩장 + 식권총 500장
from 바른손
₩230,000
결혼 반지금 반지 2개 - 고터 귀금속타운
(신부 지인찬스)
₩480,000
웨딩카그냥 우리가 직접 운전하고 집으로... ㅋㅋ₩0
한복 구매장모님??? (신부가 알아서)
예단현금??? (신부 부모님이 알아서)
예단 답례현금
(받은 돈의 일부를 돌려드림)
??? (신랑 부모님이 알아서)
축가1, 2 답례-₩240,000
주례 답례-₩150,000
사회자 답례돈 싫다고 하셔서
카카오 인형 선물 드림
₩100,000
회사 결혼 답례떡집 근처 떡집
- 떡마당 (따로 스티커 출력)
₩180,000
결혼식 연회 식비
(인당 38000)
하객 수가 보증했던 330 보다 적은 327명 옴
결국 330 명 치 개인 하객수만큼 각자 계산
₩1,254,000
신혼여행
2인 왕복 비행기값
from 모두투어
(인천 > 바르셀 + 리스본 > 인천)
₩2,930,800
바르셀로나 숙박비(4박)
by Booking.com
₩493,340
2인 중간 이동 비행기값
by Orbitz
(바르셀 > 리스본)
₩122,000
리스본 숙박비(5박)
by Booking.com
₩616,675
가우디 현지투어 2명
from 마이리얼트립
₩96,605
와이파이 도시락(11일) + 보조배터리 1개₩102,630
디너+플라멩고 공연₩200,000
유로 환전
8일x6만원x2명
₩1,000,000
여행자보험 (10일)₩40,000
혼수
삼성 무풍 에어컨 세트₩2,520,000
에어컨 설치비₩80,000
에몬스 쇼파 (반절만 천연가죽)₩519,300
삼성 스마트 TV 42인치 + 스피커
(신랑 지인 찬스)
₩800,000
시몬스 침대 + 침대옆 선반장 1개
from 산본 롯데 피트인
₩2,000,000
삼성 냉장고 4도어
(신랑 지인 찬스)
₩2,200,000
신부가 알아서 고른
거실장 (우드 화이트)
₩200,000
수납 가구 (한샘)
- TV 다이 2개
- 서랍장 1개
₩134,700
옷방에 사용할 왕자 행거
- 행거 선반 2개
- 일반 행거 2개
₩139,600
4인 식탁 from 한샘₩369,000
비용 총계₩20,911,650




1 2 3 4 5 6 7 8 9 10 다음


통계 위젯 (블랙)

1238
787
156242

GoogleAdsenseResponsive

Cluster map