cron에 대해서 그동안 한 번쯤은 포스팅 했을 줄 알았는데, 찾아보니 없어서 이번 기회에 한 번 정리해본다!

 

cron

- 주기적으로 실행해야 하는 작업(task)을 관리하기 위한 시간 기반 잡-스케줄러(Job Scheduler)

- 사용자들은 crontab 파일을 사용하여 특정 시간에 특정 명령이나 스크립트를 실행하도록 설정

- 시스템 유지보수 작업, 데이터 백업, 로그 분석 등 다양한 자동화 작업을 주기적으로 수행하는 데 사용

 

Linux 사용자라면 누구나 알고 있지만, 의외로 누구나 사용하지는 않는/못하는 도구이다 !!!

 

Unix 계열이라면 어디에나 존재하고 있는 시간 기반의 잡-스케줄러이고,

아주 기본이 되는 도구이다보니 이를 기반으로 동작하는 다른 유틸리티도 다양하게 존재하고 있다.

 

 

Etymology(어원)

 "cron"이라는 명칭은 어디에서 비롯되었을까?

 

- 그리스 신화에서 "시간의 본질"을 상징하는 신 "Chronos"에서 비롯되었다고 한다.

  . https://en.wikipedia.org/wiki/Cron

  . 왠지 시계 관련하여 많이 들어본 이름인 것 같다~

출처: chatgpt (by whatwant)

 

 

History (역사)

- 시작은 1975년 그 유명한 "AT&T Bell 연구소"에서 탄생되었다고 한다.

- Linux의 등장과 함께 다양한 cron alternative들이 등장하게 되는데

- 현재 가장 널리 퍼진 것은 1987년에 탄생된 vixie-cron 이라고 한다.

  . https://github.com/vixie/cron

https://github.com/vixie/cron/blob/master/Documentation/Changelog.md

 

- Red Hat에서 vixie-cron 4.1을 fork해서 만든 cronie 프로젝트도 있고,

  . https://github.com/cronie-crond/cronie

- vixie-cron과의 호환성을 보여주는 mcron 프로젝트도 있다.

  . https://github.com/Dale-M/mcron

 

 

Check

이번 포스팅을 작성하는 환경은 "Ubuntu 20.04.6 LTS" 이다.

다른 환경에서도 얼추 비슷하지 않을까 하지만, 혹시라도 다른 결과가 나올 수도 있다는 점은 유념 !!!

 

- 패키지 설치 여부

  . dpkg -l | grep cron

 

- 실행파일 위치

  . which cron

 

- 서비스 상태

  . systemctl status cron

출처: https://www.whatwant.com

 

 

crontab

- "cron table"의 약자로써, cron 데몬이 실행해야할 작업들의 스케줄을 정의한 테이블을 의미한다.

- 테이블을 작성/수정할 수 있도록 해주는 유틸리티 명칭이기도 하다.

- 첫 실행을 하면 어떤 에디터를 사용할 것인지 물어본다.

  . 개인적으로 애용하는 nano 에디터를 추천해줘서 더 반갑다!!! ^^

select-editor

 

- 정확히 표현하자면, 현재 사용하는 계정에서 처음 실행할 때 기본 에디터를 설정해주는 것이다.

crontab -e

 

- 각 계정별로 하나의 (cron) table이 주어진다.

- 간단한 가이드를 주석(#)에서 확인할 수 있다.

 

- cron 관련해서 항상 우리를 괴롭히는 익숙하지 않은 시간 표현 순서 !!!

 

 

- dom : day of month

- dow : day of week

 

- 잘 동작하는지 한 번 테스트 해보자.

sample

 

- 이미 알고 있겠지만, " * "는 every를 의미한다. 즉, 매분마다 환경변수들을 /tmp/env.output에 저장하게 된다.

 

 

Seperator (구분자)

정보를 입력할 때 각 값들을 구분하기 위해서 기본적으로 space 한 칸을 사용했을 것이다.

만약 space 두 칸을 사용해도 괜찮을까? 괜찮다! 여러개의 space를 사용해도 잘 인식한다.

심지어 tab을 사용해도 된다 !!!

 

 

Represent (표현식)

- 기본적인 내역은 다음과 같다.

 

- 특수 문자들은 다음과 같다.

 

 

Example (예시)

몇 가지 사례를 들어보자. ( "?"는 사실 낚시성일까나..... ㅋㅋ )

 

- 매일 오전 10시 15분에~

 

- 매일 오후 3시에 시작해서 5분마다 실행되어 오후 3시 55분에 끝나고,

  다시 오후 7시에 시작해서 5분마다 실행되어 오후 7시 55분에 끝남

 

- 매일 00시 30분부터  6시간 마다 실행 (00:30, 06:30, 12:30, 18:30)

 

 

- 평일(월요일~금요일) 1시 30분 부터 매 6시간 마다 실행 (01:30, 07:30, 13:30, 19:30)

 

 

Log

Ubuntu 환경에서 cron 로그를 위한 기본 경로는 "/var/log/cron.log" 이다. 하지만,

 

로그 기록을 활성화 시켜줘야 한다.

 

주석 처리 되어 있는 cron 부분을 확인 후, 주석 제거하고 저장하면 된다.

 

서비스 적용을 위해 rsyslog 재시작을 한 번 해주면 된다.

 

이제 cron이 잘 동작했는지 확인할 수 있는 로그를 볼 수 있게 되었다.

 

 

Remove (삭제)

현재 crontab 내역을 확인하고 싶으면 "-l" 옵션을 사용할 수 있다.

 

전체 내용을 삭제하고 싶다면, "-r" 옵션을 사용할 수 있다.

 

특정 스케줄만 삭제하고 싶다면? "-e" 옵션으로 편집 화면에서 해당 라인을 삭제하면 된다 !!!

 

 

Helper (도우미)

① CronTool (https://tool.crontap.com/cronjob-debugger)

   - 오른쪽 하단위 Cheetsheet를 보면 hour 부분에 Values Range 오타가 조금 아쉽긴 하지만,

 

  - 깔끔한 화면과 함께, 달력으로 설정 내역을 보여주는 것이 정말 괜찮다.

 

 

② Cronitor (https://crontab.guru/)

  - 정말 simple하고 URL 주소를 외우기도 쉽다.

 

 

③ CronMaker (http://www.cronmaker.com/?1)

  - 원하는 cron 표현식을 쉽게 만들 수 있도록 편리한 인터페이스를 제공해주고 있다.

 

 

지금까지 살펴본 내용 외에도 더 많은 것들이 남아있다.

cron의 세계는 의외로 넓다 !!

 

하지만, 한 번에 너무 많은 것을 알게 되면 다칠 수 있으므로(?) 여기에서 일단 마무리 해보련다 !!!

절대 지쳐서 그런 것 아니다! (그런가? ^^)

 

반응형

전자제품을 구매하고 언박싱을 하면 매번 튀어나오는 매뉴얼...

하지만, 우리는 보통 그 매뉴얼을 거들떠 보지도 않는다. 어!? 나만 그런가!? ^^

 

리눅스 서버를 구성하고 종종 확인하는 리소스...

솔직히... 그 의미가 어떤 것인지 경험으로만 파악했지, 정확한 의미는 잘 모른다. 어?! 나만 그런가?! ^^

 

[ Environment ]

- VM : VirtualBox v7.0.6 r155176

- OS : Ubuntu 20.04 LTS

 

VirtualBox

 

 

[ top ]

내 서버가 왠지 힘들어하는 것 같으면 가장 먼저 확인하는 것이 'top' 명령어이다.

> top

 

여기에서 주로 보는 것은 다음의 'load average' 영역일 것이다.

load average

 

'load average'는 시스템의 부하정도를 알려주는 지표인데,

실행중인 프로세스 또는 Disk I/O 등을 위해 대기하고 있는 프로세스의 정도를 알려주는 정보로써

CPU core 1개당 1 이상의 값을 갖는다면 대기해야하는 task가 있다는 의미로 이해하면 된다.

 

그런데, 왜 3개의 값이 보일까?!

1분 / 5분 / 15분 순서로 값을 보여주는데, 이를 통해 부하가 심해지고 있는지 해소되고 있는지 경향을 볼 수 있다.

 

개인 PC라면 가성비로 사용해야하기에 1에 맞춰서 Spec을 확보해도 괜찮겠지만

서비스를 위한 서버라면 아무리 돈이 없어도 평균 0.5 이하로 맞춰야 그나마 성능 저하 없이 사용할 수 있다.

 

일단 여기까지만 알아도 충분하지 않을까!? ^^

 

 

[ core ]

우리가 요즘 사용하는 CPU는 거의 multi-core일 것이다.

어!? 그런데, 생각해보니 Kubernetes에서 POD의 core를 소숫점으로도 줄 수 있는데... 일단 지금은 무시!!! ^^

core

 

실습을 하고 있는 환경은 일단 VirtualBox에서 2 core를 할당했다.

정말 잘 되어있는지 확인해보자.

> cat /proc/cpuinfo

 

스크린샷을 다 찍기에는 너무 길어져서 잘랐는데.... 그냥 심플하게 확인하려면 다음과 같이 하면 된다.

> grep -c processor /proc/cpuinfo

 

2 core가 잘 할당되어 있는 것을 볼 수 있다.

 

다른 명령어로도 확인할 수 있다.

> lscpu

 

 

[ full-load CPU ]

CPU 관련한 부하가 한계치까지 가면 어떻게 되는지 시뮬레이션을 해보자.

 

> nano cpu.py
#!/usr/bin/python

test = 0
while True:
    test = test + 1

 

Terminal 탭을 2개를 열고 진행을 해보자.

> python ./cpu.py

 

> top

 

응?! 그런데, 2 core 인데...

CPU 100%라고 하면, load 값이 2가 되어야 할 것 같은데 ... 1 값으로 수렴하고 있는 것 처럼 보인다.

 

그 이유는!

지금 실행되고 있는 python은 core 1개에서 실행되고 있기 때문이다!

 

그러면... python을 하나 더 실행해보자.

> python ./cpu.py

 

그리고나서 top을 다시 한 번 확인해보면,

> top

 

2 core이기 때문에, 각각 100% 실행이 되고 있으니... 2 값으로 나온다.

 

어!? 그러면 하나 더 실행하면!?

> top

 

밑에 보이는 리스트 형식의 내역을 보면 CPU는 총 200%를 3으로 나눠서 사용하고 있는 것이 보일 것이다.

'load average' 값은 3값으로 수렴하고 있다.

 

 

[ uptime]

'top' 명령어 말고 다른 명령어도 알아보자.

> uptime

 

지속적으로 값을 보여주는 것이 아니라 1회성으로 뿌려주고 끝난다.

 

 

[ /proc/loadavg ]

또 다른 방법으로도 확인해볼 수 있다.

> cat /proc/loadavg

 

 

[ w ]

top 명령어와 uptime 명령어의 중간쯤에 위치하고 있는 것 같은 'w' 명령어도 있다.

> w

 

 

그런데, 'load average'를 발생시키는 요인이 CPU 사용만 있을까!?

답은.... 당연히... 아니다 !!!

 

 

[ full-load Disk I/O ]

디스크에 읽고 쓰는 것도 부하를 야기한다.

 

> nano io.py
#!/usr/bin/python

while True:
    f = open("./test.txt", 'w')
    f.write("TEST")
    f.close()

 

> python ./io.py

 

> top

 

CPU 사용량은 9%를 찍고 있지만 'load average'를 보면 1에 수렴하고 있다.

 

CPU 100%를 찍으면 어떻게 될까?

 

> python ./cpu.py

 

> top

 

'load average'를 보면 2에 수렴하고 있지만 CPU 사용량을 보면 차이가 있다.

 

 

그렇다.

'load average'는 단순하게 Running 중인 프로세스 뿐만 아니라 Disk I/O로 인해 대기타는 것도 같이 바라보고 있다.

 

그러면, 이렇게 부하가 잡히고 있을 때 분석은 어떻게 하면 될까!?

일단은 뭐, top으로 확인 가능한 아래 리스트 목록으로 추적이 가능하다.

 

하지만, CPU 부하가 문제인지 Disk I/O 대기가 문제인지 어떻게 알 수 있을까?

 

 

[ vmstat ]

어떤 상태인지 'vmstat' 명령어를 사용해보자.

> vmstat

 

'vmstat' 명령어는 일단 Virtual Memory Statistics의 약자로써 현재 CPU 및 Memory 사용량을 알 수 있다.

 

지금 여기에서 살펴볼 것은 앞 부분에 있는 "r"과 "b" 부분이다.

 

"r"은 현재 실행하려고 하거나 실행 중인 프로세스의 개수를 알려주는 것이고

"b"는 uninterruptible sleep 상태의 프로세스 개수, 즉 I/O 대기를 하고 있는 프로세스의 개수를 알려준다.

 

중간에 io.py의 실행을 종료하면 어떻게 나오는지를 살펴보자.

> vmstat 1

 

중간에 보면 "b" 부분이 0으로 바뀌는 것을 확인할 수 있다.

 

 

우리 서버가 지금 힘들어하지는 않는지

머리(CPU)가 아픈지 손(I/O)이 바쁜지 파악해서 해결해주도록 하자.

반응형

이전에 "dd"를 이용해서 대용량 더미 파일 생성하는 것을 살펴봤었다.

https://www.whatwant.com/entry/대용량-더미-파일-만들기-Ubutnu-1404-64bit

 

이번에는 좀 다른 명령어를 이용해 보고자 한다.

 

 

0. Environment

  - OS: Ubuntu 20.04.6 LTS

 

 

1. fallocate

  - 소문자 L 옵션을 사용해서 원하는 용량, 파일 이름을 명시하면 된다.

 

❯ fallocate -l 100MB server-1.dummy

❯ ls -al
합계 97668
drwxrwxr-x 2 chani22 chani22           4096  6월 28 00:16 .
drwxrwxr-x 4 chani22 chani22           4096  6월 28 00:15 ..
-rw-rw-r--    1 chani22 chani22 100000000  6월 28 00:16 server-1.dummy

 

 

2. truncate

  - 소문자 S 옵션을 사용하는 것을 제외하고 fallocate 명령어와 동일하다.

 

❯ truncate -s 100MB client-1.dummy

❯ ls -al
합계 8
drwxrwxr-x 2 chani22 chani22      4096  6월 28 00:22 .
drwxrwxr-x 5 chani22 chani22      4096  6월 28 00:22 ..
-rw-rw-r-- 1 chani22 chani22 100000000  6월 28 00:22 client-1.dummy

 

 

3. dd (random)

  - 그냥 0으로 채워버리는 dummy file을 만들면 git 전송 속도 등을 측정할 때 압축이 되어버려 애매해진다.

  - 압축이 제대로 안되도록 하려면 random 값으로 채워지는 dummy file을 만드는 것이 유리하다.

 

❯ dd if=/dev/urandom of=client-3.dummy bs=100M count=1
1+0 레코드 들어옴
1+0 레코드 나감
104857600 bytes (105 MB, 100 MiB) copied, 0.330475 s, 317 MB/s

❯ ls -al
합계 102408
drwxrwxr-x 2 chani22 chani22      4096  6월 28 00:28 .
drwxrwxr-x 5 chani22 chani22      4096  6월 28 00:22 ..
-rw-rw-r-- 1 chani22 chani22 100000000  6월 28 00:22 client-1.dummy
-rw-rw-r-- 1 chani22 chani22 100000000  6월 28 00:23 client-2.dummy
-rw-rw-r-- 1 chani22 chani22 104857600  6월 28 00:28 client-3.dummy

 

  - 자세히 보면 파일 크기가 좀 차이가 있는 것도 확인해볼 수 있다.

 

 

여러 옵션이나 차이점 등이 궁금하긴 하지만,

굳이 시간을 쏟아 파고들 것 까지는 아닌 것 같아 여기서 멈추련다 ~ ^___^

 

반응형

 

간만에 Server 버전을 설치해야할 상황이 생겨서 기록을 남겨보고자 한다.

 

https://ubuntu.com/download/server

 

현재 정확한 버전은 22.04.02 LTS 이다.

Server 버전임에도 용량이 1.8GB 라니 .... 대박이구만...

 

일단 아래 과정은 Windows 10 Host 환경의 VirtualBox 7.0.6 버전에서 진행을 했다.

 

운영체제는 Ubuntu (64-bit) 로 선택해야 한다.

 

VirtualBox - OS

 

지금 필요로 하는 환경이 낮은 Spec이어야 해서 2GB 메모리로만 설정을 했고,

core가 2개 이상이어야 해서 일단 2개로 선택했다.

 

VirtualBox - HW

 

디스크 용량은 어짜피 동적 용량이기에 조금은 여유있게 설정해주는 것이

혹시 모를 나중에 대비해 바람직한 선택이다.

 

VirtualBox - HDD

 

네트워크 설정은 "NAT"를 선택하는 것이 일반적이지만,

여기에서는 "어댑터에 브리지"를 선택해서 Host와 동일한 레벨에서 IP를 받을 수 있도록 하겠다.

(집에서 공유기를 쓰는 환경이라고 하면 공유기로부터 IP를 직접 받도록 하는 것)

 

VirtualBox - Network

 

이제 다운로드 받은 Ubuntu Server ISO 이미지를 등록해서 부팅 및 설치를 진행하자.

별도로 설명하지 않은 부분은 기본 설정으로 진행한 것이다.

 

Ubuntu Server

 

IP도 잘 받아온 것을 볼 수 있다.

 

IP

 

기본이 LVM 이다. 흐음... 그냥 가자.

 

LVM

 

기본 설정은 free 공간을 두는데, 그냥 전체를 다 사용하는 것으로 변경해보자.

 

Before

 

ubuntu-lv 설정을 아래와 같이 잡아주면 된다.

 

edit

 

after

 

OpenSSH server 설치는 필수다!!!

 

OpenSSH server

 

설치가 끝나면 Close 해줘야 한다.

 

Close

 

재부팅 하면 아래와 같이 에러 화면이 나오기도 한다.

걱정하지 말자.

 

cloud-init

 

엔터 한 번 치고

앞에서 입력한 계정 및 패스워드 치면 로그인 된다.

 

login

 

기분 나쁘게 에러 발생한 패키지부터 삭제하자

 

$ sudo apt purge cloud-init

 

sudo 했을 때 패스워드 입력하는게 기분나쁘니(?) 해결하자.

 

$ sudo visudo

 

제일 밑에 아래와 같이 (각자 계정으로) 입력해놓고 저장하면 된다.

 

whatwant ALL=(ALL) NOPASSWD:ALL

 

패키지 전체적으로 업데이트 및 업그레이드 하자.

 

$ sudo apt update

$ sudo apt upgrade

 

아래와 같은 화면이 나올 수 있는데, 그냥 바로 OK 하자.

 

 

필요 없는 것들 지우고 깔끔히 재부팅하자.

 

$ sudo apt autoremove

$ sudo reboot

 

 

Server에서 굳이 한글이 필요할까 싶지만, 그래도 세종대왕님을 생각하며...

 

$ sudo apt install language-pack-ko

$ sudo locale-gen ko_KR.UTF-8

$ sudo dpkg-reconfigure locales

$ sudo update-locale LANG=ko_KR.UTF-8 LC_MESSAGES=POSIX

 

locale

 

네트워크 관련 도구들을 사용하기 위해 net-tools 패키지를 설치하자.

 

$ sudo apt install net-tools

 

많이 쓰는 git 패키지도 설치하고, 기본 환경 설정까지 해놓자.

 

$ sudo apt install git

$ git config --global user.name "whatwant"
$ git config --global user.email "whatwant@gmail.com"

 

우리는 한국에 살고 있으니, TimeZone을 맞춰보자.

 

$ sudo timedatectl

               Local time: 금 2023-04-14 16:14:51 UTC
           Universal time: 금 2023-04-14 16:14:51 UTC
                 RTC time: 금 2023-04-14 16:14:51
                Time zone: Etc/UTC (UTC, +0000)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

 

정확한 TimeZone 명칭을 확인해보고,

 

$ sudo timedatectl list-timezones | grep Seoul

Asia/Seoul

 

설정해주면 된다.

 

$ sudo timedatectl set-timezone Asia/Seoul

$ sudo timedatectl

               Local time: 토 2023-04-15 01:16:05 KST
           Universal time: 금 2023-04-14 16:16:05 UTC
                 RTC time: 금 2023-04-14 16:16:05
                Time zone: Asia/Seoul (KST, +0900)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

 

심지어 "System clock synchronized: yes"라고 되어있는 것을 보면 시간 동기화 설정도 이미 되어있다!

 

 

 

개인적인 취향에 따른 설정도 추가적으로 해보자.

 

vi를 싫어하고 nano를 사용하기에 nano 기본 설정값을 넣어보겠다.

 

$ nano ~/.nanorc

 

tab을 공백 4칸으로 설정하는 것이다.

 

set tabsize 4
set tabstospaces

 

root 권한으로 사용하는 경우, 특히 sudo 사용할 때를 위해서 추가적으로... (내용은 동일)

 

 $ sudo nano /root/.nanorc

 

 

지극히 개인적인 취향으로 작업 공간 설정도 해놓겠다.

 

$ sudo mkdir /srv/workspace
$ sudo mkdir /srv/install

$ sudo chown whatwant:whatwant /srv/workspace/
$ sudo chown whatwant:whatwant /srv/install/

 

Server 환경이니만큼 굳이 zsh 등까지는 설치하지 않겠다.

 

 

추가적으로 VirtualBox Guest-Additions를 설치해보자.

GUI 환경이 없기에 생략할 수도 있긴 한데.... 그래도 성능 향상이 있다고 하니 해보자.

 

게스트 확장 CD 이미지

 

우리는 지금 Server 버전의 Ubuntu이기에 직접 마운트 작업을 해줘야 한다 ^^

 

$ sudo mkdir /media/cdrom

$ sudo mount /dev/cdrom /media/cdrom

 

해당 디렉토리로 이동해보자.

 

$ cd /media/cdrom/

$ ls -al

total 41763
dr-xr-xr-x 5 root root     2570  1월 12 01:28 .
drwxr-xr-x 3 root root     4096  4월 15 13:40 ..
-r--r--r-- 1 root root     1049  8월 23  2022 AUTORUN.INF
dr-xr-xr-x 2 root root     1252  1월 12 01:28 NT3x
dr-xr-xr-x 2 root root     2828  1월 12 01:28 OS2
-r--r--r-- 1 root root      592  1월 12 01:28 TRANS.TBL
-r--r--r-- 1 root root  2202917  1월 11 23:38 VBoxDarwinAdditions.pkg
-r-xr-xr-x 1 root root     4225  1월 11 23:35 VBoxDarwinAdditionsUninstall.tool
-r-xr-xr-x 1 root root  5968312  1월 11 23:36 VBoxLinuxAdditions.run
-r--r--r-- 1 root root  9332736  1월 11 23:38 VBoxSolarisAdditions.pkg
-r-xr-xr-x 1 root root 15755216  1월 12 01:27 VBoxWindowsAdditions-amd64.exe
-r-xr-xr-x 1 root root  9227840  1월 12 01:08 VBoxWindowsAdditions-x86.exe
-r-xr-xr-x 1 root root   243728  1월 11 23:38 VBoxWindowsAdditions.exe
-r-xr-xr-x 1 root root     6849  1월 11 23:35 autorun.sh
dr-xr-xr-x 2 root root     1468  1월 12 01:28 cert
-r-xr-xr-x 1 root root     5097  1월 11 23:35 runasroot.sh
-r--r--r-- 1 root root      259 10월  2  2021 windows11-bypass.reg

 

Guest-Additions를 설치하기 위해서 필요한 패키지들을 먼저 설치해줘야 한다.

 

$ sudo apt install -y dkms build-essential linux-headers-generic linux-headers-$(uname -r)

 

이제 설치를 진행하면 된다.

 

$ sudo ./VBoxLinuxAdditions.run

 

무슨 이상한 에러메시지가 나올 수 있으나 쫄지 말자.

GUI 환경이 없기에 발생하는 것이다.

 

재부팅하고 잘 설치되었는지 확인까지 해보자.

 

$ sudo reboot

---

$ lsmod | grep vbox

vboxguest             434176  0

$ modinfo vboxguest

filename:       /lib/modules/5.15.0-69-generic/misc/vboxguest.ko
version:        7.0.6 r155176
license:        GPL
description:    Oracle VM VirtualBox Guest Additions for Linux Module
author:         Oracle and/or its affiliates
srcversion:     55B45B43FE1759D12174E93
alias:          pci:v000080EEd0000CAFEsv00000000sd00000000bc*sc*i*
depends:
retpoline:      Y
name:           vboxguest
vermagic:       5.15.0-69-generic SMP mod_unload modversions

 

여기까지~ 끝~

반응형

내 M1 맥북을 개발용 장비로 자리잡도록 하기 위해 GPU 사용하는 Tensorflow 실행환경을 맞추고 싶어서 해봤다.

 

 

1. Xcode Command Line Tools 설치

  - 이미 Xcode를 설치했더니 에러 메시지가 나온다.

  - 기존에 Xcode를 설치하지 않은 분들은 "명령어 라인 개발자 도구"를 설치할 것이냐고 묻는 창이 나온다.

$ xcode-select --install

xcode-select: error: command line tools are already installed, use "Software Update" to install updates


$ xcode-select --version

xcode-select version 2395.

 

 

2. Miniforge3 설치

  - M1 맥북에서는 Anaconda 설치가 안되기에 Miniforge3를 설치하고자 한다.

  - https://github.com/conda-forge/miniforge

$ cd ~/Downloads

$ wget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-MacOSX-arm64.sh

# wget 명령어가 안되면 `brew install wget` 실행
# 또는 그냥 Chrome에서 다운로드 받아도 됨

$ sh Miniforge3-MacOSX-arm64.sh

# 중간에 계속 `yes` 해주면 됨

$ conda info

 

  - 터미널(또는 iTerm2)를 재시작하면 커서 앞 부분에 `(base)`를 볼 수 있을 것이다.

 

[참고 #1] 쉘 실행할 때 자동으로 conda가 활성화 되는 것이 싫을 때에는 다음과 같이 설정하면 된다고 한다.

$ conda config --set auto_activate_base false

 

[참고 #2] 현재 conda env 목록을 확인하거나 실행중인 env를 끄고 싶을 때에는 다음과 같이 하면 된다.

$ conda env list

$ conda deactivate {envname}

 

 

3. 가상환경 만들기

  - 각자 원하는 경로를 준비한 뒤, 가상환경을 생성하면 된다.

$ cd ~/workspace
$ mkdir tensorflow
$ cd tensorflow

$ conda create -n tensorflow python=3.9

$ conda activate tensorflow

 

 

 

4. TensorFlow dependencies 설치

$ conda install -c apple tensorflow-deps

 

 

5. TensorFlow 설치

$ python -m pip install tensorflow-macos

 

 

6. TensorFlow-Metal (GPU framework) 설치

$ python -m pip install tensorflow-metal

 

 

7. TensorFlow 버전 확인

$ python

>>> import tensorflow
>>> tensorflow.__version__
'2.8.0'

 

 

8. Test

$ nano ./test.py
import tensorflow as tf

mnist = tf.keras.datasets.mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(x_train, y_train, epochs=5)

model.evaluate(x_test,  y_test, verbose=2)
❯ python test.py

Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz
11493376/11490434 [==============================] - 3s 0us/step
11501568/11490434 [==============================] - 3s 0us/step
Metal device set to: Apple M1

systemMemory: 8.00 GB
maxCacheSize: 2.67 GB

2022-04-05 00:17:23.938189: I tensorflow/core/common_runtime/pluggable_device/pluggable_device_factory.cc:305] Could not identify NUMA node of platform GPU ID 0, defaulting to 0. Your kernel may not have been built with NUMA support.
2022-04-05 00:17:23.938287: I tensorflow/core/common_runtime/pluggable_device/pluggable_device_factory.cc:271] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 0 MB memory) -> physical PluggableDevice (device: 0, name: METAL, pci bus id: <undefined>)
2022-04-05 00:17:24.494088: W tensorflow/core/platform/profile_utils/cpu_utils.cc:128] Failed to get CPU frequency: 0 Hz
Epoch 1/5
2022-04-05 00:17:24.640534: I tensorflow/core/grappler/optimizers/custom_graph_optimizer_registry.cc:113] Plugin optimizer for device_type GPU is enabled.
1875/1875 [==============================] - 10s 4ms/step - loss: 0.2934 - accuracy: 0.9150
Epoch 2/5
1875/1875 [==============================] - 8s 4ms/step - loss: 0.1379 - accuracy: 0.9586
Epoch 3/5
1875/1875 [==============================] - 8s 4ms/step - loss: 0.1019 - accuracy: 0.9693
Epoch 4/5
1875/1875 [==============================] - 8s 4ms/step - loss: 0.0832 - accuracy: 0.9739
Epoch 5/5
1875/1875 [==============================] - 8s 4ms/step - loss: 0.0715 - accuracy: 0.9780
2022-04-05 00:18:05.571816: I tensorflow/core/grappler/optimizers/custom_graph_optimizer_registry.cc:113] Plugin optimizer for device_type GPU is enabled.
313/313 - 1s - loss: 0.0806 - accuracy: 0.9743 - 985ms/epoch - 3ms/step

 

  - 뭔가 에러 메시지가 나와서 예쁘지는 않는데...  GPU는 사용하고 있다.

GPU

반응형

 

리눅스를 CLI 방식으로 원격 접속하는 것은 비교적 쉽다.

`openssh-server` 설치 후에 사용자 계정으로 접속하면 끝이다.

 

그런데, 리눅스에서 GUI 방식으로 접속하는 것은 쉽지 않다.

 

Windows 환경에서는 원격데스크탑(mstsc) 이용하면 끝인데,

리눅스에서는 뭔가를 설치하고 설정을 해줘야 한다.

 

프로그램의 선택지도 다양하다.

- TightVNC

- RealVNC

- TeamViewer

- xrdp

- https://en.wikipedia.org/wiki/Comparison_of_remote_desktop_software

 

 

그런데, Windows에서의 원격데스크탑은

본래 사용하고 있던 화면 그대로의 모습으로 작업하던 세션 그대로 연결이 되는데

위에서 언급한 대부분의 리눅스 원격데스크탑 도구들은 그렇지가 않다.

 

그러던 중 알게된 vino

다른 사람들은 다 알고 있었는데, 나만 몰랐나!?

구글 검색을 해보니 아직 그다지 많은 자료가 없는 것으로 보아 아직 유명하지는 않은 것 같다.

 

 

 

1. Install

  - 기본 설치되어 있다. 혹시 모르니 그래도 한 번 더 확인!

❯ sudo apt install vino

패키지 목록을 읽는 중입니다... 완료
의존성 트리를 만드는 중입니다       
상태 정보를 읽는 중입니다... 완료
패키지 vino는 이미 최신 버전입니다 (3.22.0-3ubuntu1.2).
vino 패키지는 수동설치로 지정합니다.
0개 업그레이드, 0개 새로 설치, 0개 제거 및 0개 업그레이드 안 함.

 

2. Settings

  - 기본 설정 화면에서 확인할 수 있다.

  - 암호 설정을 하면 된다.

  - 하지만, 암호 길이 제한일 비롯해서 추가적인 설정을 하려면 `dconf-editor`가 필요하다.

 

 

3. dconf-editor

  - 마찬가지로 설치는 쉽다.

❯ sudo apt install dconf-editor
  
패키지 목록을 읽는 중입니다... 완료
의존성 트리를 만드는 중입니다       
상태 정보를 읽는 중입니다... 완료
다음 새 패키지를 설치할 것입니다:
  dconf-editor
0개 업그레이드, 1개 새로 설치, 0개 제거 및 0개 업그레이드 안 함.

  - 설치한 dconf-editor를 실행하자.

  - `/org/gnome/desktop/remote-access` 파일을 편집하자

  - `require-encryption` 항목을 꺼주자. 보안상 문제의 여지가 있지만 이 부분은 좀 더 알아보기로 하고...

  - 만약 password를 8자 이상 사용하고 싶으면 base64 encoding 해서 `vnc-password` 항목에 넣어주면 된다.

 

 

4. VNC Viewer

  - 사용하지 않았던 것으로 해보련다.

    . ultraVNC - https://uvnc.com/

  - Viewer로만 사용할거니 그에 맞게 설치하면 된다.

 

 

5. Connect

  - 이제 연결할 일만 남았다.

  - IP만 쓰고 Connect 하면 된다. 세부 옵션을 사용하고 싶으면 `Show Options`

  - 앞에서 입력해놓은 패스워드 사용

  - 정말 원하는대로 나온다!!!

 

 

정말 손쉽게 사용할 수 있다. 강추 !!!

 

반응형

 

# Background Description

파일 서버 용도로 사용하던 PC의 운영체제가 Windows XP 였는데,

더이상 기술지원이 안된다고 하여서

이번 기회에 Ubuntu 20.04로 갈아타게 되었다.

 

 

# Issues

기존 부터 사용해오던 공유폴더를 사용해서

Windows PC와 파일을 계속 주고 받고 싶다.

 

 

# Environment

## Windows PC

- Edition: Windows 10 Pro

- Version: 21H1

 

## Linux PC

- Distribution: Ubuntu

- Version: 20.04

 ❯ lsb_release -a

 No LSB modules are available.
 Distributor ID: Ubuntu
 Description: Ubuntu 20.04.3 LTS
 Release: 20.04
 Codename: focal


 ❯ uname -a

 Linux HP 5.13.0-28-generic #31~20.04.1-Ubuntu SMP Wed Jan 19 14:08:10 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

 

# SAMBA

## install

- apt를 이용해서 손쉽게 설치할 수 있다.

❯ sudo apt install samba

 패키지 목록을 읽는 중입니다... 완료
 의존성 트리를 만드는 중입니다       
 상태 정보를 읽는 중입니다... 완료
 다음의 추가 패키지가 설치될 것입니다 :
   attr ibverbs-providers libboost-iostreams1.71.0 libcephfs2 libibverbs1 librados2 librdmacm1 python3-crypto
   python3-dnspython python3-gpg python3-markdown python3-packaging python3-pygments python3-pyparsing
   python3-samba python3-tdb samba-common samba-common-bin samba-dsdb-modules samba-vfs-modules tdb-tools
 제안하는 패키지:
   python-markdown-doc python-pygments-doc ttf-bitstream-vera python-pyparsing-doc bind9 bind9utils ctdb ldb-tools
   ntp | chrony smbldap-tools winbind heimdal-clients
 다음 새 패키지를 설치할 것입니다:
   attr ibverbs-providers libboost-iostreams1.71.0 libcephfs2 libibverbs1 librados2 librdmacm1 python3-crypto
   python3-dnspython python3-gpg python3-markdown python3-packaging python3-pygments python3-pyparsing
   python3-samba python3-tdb samba samba-common
   samba-common-bin samba-dsdb-modules samba-vfs-modules tdb-tools
 0개 업그레이드, 22개 새로 설치, 0개 제거 및 0개 업그레이드 안 함.
 10.5 M바이트 아카이브를 받아야 합니다.
 이 작업 후 70.2 M바이트의 디스크 공간을 더 사용하게 됩니다.
 계속 하시겠습니까? [Y/n]

 

## add user

- SAMBA 사용을 허가해줄 계정을 등록해줘야 한다.

- 해당 계정은 실제 계정을 사용해야 한다(Linux 계정).

❯ sudo smbpasswd -a (username)

 New SMB password:
 Retype new SMB password:
 Added user (username).

 

## set Config

- SAMBA 설정 파일 백업 먼저 하고 수정 해보자.

❯ sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.220209

❯ sudo nano /etc/samba/smb.conf

- 기본적인 옵션 설명은 아래와 같다.

옵션 value 설명
comment (text) 공유 폴더에 대한 설명
path (text) 공유 폴더 경로
read only yes/no 공유 폴더를 읽기 전용으로 설정
writable, write ok yes/no 공유 폴더를 쓰기 가능으로 설정
valid users (id, id, ...) 공유 폴더 접근 가능 유저 목록
write list (id, id, ...) 공유 폴더 쓰기 가능 유저 목록
public, guest ok yes/no 게스트 이용 가능 여부
browsable yes/no 파일 목록을 보여줄 것인지 여부
printable yes/no 프린터 스풀 파일 지정
create mask, create mode (0644 / 0777 / ...) 생성 권한
force group (group, group, ...) 접근 가능 그룹 지정
directory mask (0644 / 0777 / ...) 공유 폴더 권한

- SAMBA 설정 파일 내용 샘플은 아래와 같다.

- 기존 내용의 제일 밑에 작성하면 된다.

...
[2022]
comment = whatwant's fileserver in 2022 
path = /srv/4t-1/2022      
browsable = yes
writeable = yes
read only = no
create mode = 0777
directory mode = 0777
public = yes
valid users = whatwant

- `smb.conf` 파일을 수정했으면, 서비스 재시작을 해줘야 한다.

❯ sudo service smbd restart

 

 

# Use

- 윈도우 PC에서 접근 해보자.

smb

- `2022` 디렉토리를 더블클릭하면, 다음과 같이 인증 요구 창이 나온다.

passwd

- 앞에서 등록한 패스워드로 인증하면 된다.

 

반응형

 

이것 저것 보다가 우연히 발견한

새로운 에디터가 있어서 한 번 설치해보고 써보고자 한다.

 

https://micro-editor.github.io/

 

https://micro-editor.github.io/

https://github.com/zyedidia/micro

 

 

micro text editor

 

이름이 나쁘지는 않은 것 같은데,

일반 명사를 사용하다보니 구글링과 같은 검색을 할 때 원하는 결과를 얻기가 쉽지 않다.

 

 

Features

nano, vi, vim 등의 훌륭한 기본 에디터들이 있음에도 불구하고

굳이 `micro text editor`를 써야 하는 이유가 뭘까!?

 

- Easy to Use
- Highly Customizable
- Colors and Highlighting
- Multiple Cursors
- Plugin System
- Common Keybindings
- Mouse Support
- Terminal Emulator

 

 

뭐 좋은거 같다 ^^

 

 

 

Environments

이하 내용을 진행한 환경은 다음과 같다.

 

- Ubuntu 18.04 Desktop

 

 

 

Download

- 최신 버전 확인 후에 다운로드 부터 받아보자

   . https://github.com/zyedidia/micro/releases/

❯ wget https://github.com/zyedidia/micro/releases/download/v2.0.10/micro-2.0.10-amd64.deb

 

 

Install

- 설치도 쉽다~

❯ sudo dpkg --install micro-2.0.10-amd64.deb

 

 

 

Execute

- 실행도 쉽다~

❯ micro

micro

 

도움말을 호출하자!

`Ctrl + g` 키를 누르면 된다.

 

help

 

command 명령어를 입력하기 위한 prompt 모드 전환을 위해서는 `Ctrl + e`를 누르면 된다.

단축키를 알아보기 위해서 `help defaultkeys`를 타이핑해보자.

 

prompt

 

 

윗 창과 아랫 창을 왔다 갔다 하기 위해서는 `Ctrl+w`를 누르면 되고,

현재 위치의 창을 닫기 위해서는 `Ctrl+q`를 누르면 된다.

 

 

 

plugins

그렇다. micro editor는 plugin도 지원한다.

 

https://micro-editor.github.io/plugins.html

 

설치법도 친절하게 알려준다

plugin install

 

반응형

+ Recent posts