이 블로그는 Web 환경을 이용한 원격 제어 기술에 필요한 지식을 공유 하기 위한 블로그 입니다.
실제 개발과 프로그램 예를 위하여 Raspberry Pi와 Raspberry Pi Pico, ATmega128 보드, Arduino Mega 보드(ATmega2560), WiFi 모듈을 사용 합니다.

raspberry-linux

Raspberry - Linux
Raspberry - Linux


  • 자주 사용하는 Linux 용어 정리
    • 프로세스(Process) 란?
      • 프로세스란 사용자가 작성한 프로그램이 운영체제에 의해 메모리 공간을 할당 받아 실행 중인 프로그램을 말 한다.

      • 여러 명의 사용자들에 의해 공유되고 있는 응용프로그램은 일반적으로 각 사용자가 프로그램을 실행하는 단계에서 별도의 프로세스를 갖게 된다. 즉, 프로그램은 실행 될 때 하나 이상의 별도의 프로세스로 실행 될 수 있다.
      • 프로세스는 자식 프로세스라고도 불리는 서브 프로세스를 시작 시킬 수 있다. 자식 프로세스는 부모 프로세스의 복제로서 부모 프로세스의 자원을 일부 공유하는데, 부모 프로세스가 종료되면 더 이상 존재 할 수 없게 된다.
      • 프로세스는 명령을 수행하기 위해 운영체제에 따라 CPU, 명령어와 데이터를 저장하기 위해 물리적인 메모리 등, 여러 가지 자원을을 사용 할 수 있다.
      • 프로세스는 운영체제의 제어를 받으면서 실행(Running), 대기(Waiting), 중단(Stopped), 좀비(Zombie) 중 한 상태에 있게 된다.
      • 프로세스는 각 고유한 번호를 가지고 있으며 이를 PID(Process Identification Number) 라고 한다.
    • 데몬(Daemon) 이란?
      • 데몬(Windows에서는 서비스라고 함)은 항상 백그라운드로 실행되는 프로세스이며 대부분 부팅시에 자동으로 시작된다. 데몬은 대기 상태로 서비스 요청을 기다리다가 요청이 들어오면 해당 서비스의 요구를 처리한다.
      • 데몬 프로세스는 터미널을 통해 사용자와 대화하지 않는다. 백그라운드로 실행되며 요청을 기다리다가 요청 발생하면 요구를 처리한다.
      • 일반 프로세스는 필요한 기능(명령)을 실행하고 실행이 종료되면(명령이 끝나면) 프로세스가 소멸되는데 비하여 데몬 프로세스는 명령이 끝나도 소멸되지 않고 메모리에 상주하면서 특별한 조건이 되면 다시 명령을 실행한다.
      • 프로세스 이름 끝에 보통 ‘d’가 붙어있으며 예를 들면 네트워킹 데몬인 xinetd 이다. 이 프로세스는 부팅시에 실행되고 백그라운드에서 대기하다가 ftp 클라이언트 같은 네트워크 프로그램이 연결을 요구할 때까지 기다린다.

    • 쓰레드(Threads) 란?
      • 쓰레드란 프로세스 내에서 실제로 작업을 수행하는 주체를 의미한다. 모든 프로세스는 한 개 이상의 쓰레드가 존재하여 작업을 수행하게 되고, 두 개 이상의 쓰레드를 가지는 프로세스를 멀티 쓰레드 프로세스라고 한다.

      • 쓰레드가 독립적으로 수행되기 위한하여는 각 쓰레드를 실행하기 위한 두 가지 정보(Program Counter, Stack)를 가지고 있어야 한다.
        • Program Counter : 프로그램의 어느 부분을 실행하고 있는지에 대한 정보를 저장
        • Stack : 함수를 호출하는 순서(Function Call)와 지역변수에 대한 정보를 저장
      • 프로세스는 독립된 각각의 프로세스들이 독립된 영역을 가지고 있는 반면, 쓰레드는 하나의 프로세스 내에서 여러개 존재하므로 그 프로세스에 있는 전역(global) 변수와 정적(static) 변수, 동적으로 할당된 메모리 공간을 서로 "공유" 하게 된다. 따라서 메모리 공간을 독립적으로 가지고 있을 필요가 작기 때문에 Light weight process 라고도 한다.
      • 쓰레드는 그 프로세스에 있는 전역 변수와 정적 변수, 동적으로 할당된 메모리 공간을 서로 "공유" 하기 때문에 쓰레드 사이의 데이터 전달(공유)가 용이하다. 그러나 데이터를 공유하기 때문에 경합조건(race condition) 과 상호배제 (mutual exclusion)에 대한 이해를 필요로 한다.
        • 경합조건(race condition): 다중 프로그래밍 시스템이나 다중 처리기 시스템에서 두 명령어가 동시에 같은 기억 장소를 액세스할 때 그들 사이의 경쟁에 의해 수행 결과를 예측할 수 없게 되는 것.
        • 상호배제 (mutual exclusion): 여러 개의 병렬 프로세스가 공통의 변수 또는 자원에 접근할 때 그 조작을 정당하게 실행하기 위하여 접근 중인 임의의 시점에서 하나의 프로세스만이 그 접근을 허용하도록 제어하는 것.
      • 단일 쓰레드(Single-thread)와 다중 쓰레드(Multi-thread) 프로세스(processes)
      • 아래 그림은 싱글 쓰레드로 구성된 프로세스와 멀티 쓰레드로 구성된 프로세스를 설명하기 위한 예 이다. 멀티 쓰레드로 구성된 프로세스도 각 쓰레드는 Registers와 Stack, Program Counter 정보를 갖고 있기 때문에 Data와 File을 공유하며 각 쓰레드를 병렬로 처리하는 것이 가능하다.


  • 리눅스 파일 시스템(Linux file system)
    • 파일시스템(File system)이란 파일(자료)를 사용자가 쉽게 접근 및 발견 할 수 있도록 운영체제가 시스템의 디스크상에 일정한 규칙을 가지고 파일을 보관하는 방식이다.

    • 리눅스 디렉토리 구성
      • 리눅스의 파일 시스템은 /(Root directory) 아래에 계층적으로 모든 파일과 디렉토리가 만들어진다. 각 리눅스 배포판 마다 약간의 차이는 있지만 대부분의 배포판에서 다음과 같은 디렉토리(여기서는 중요 디렉토리만 설명 함)들을 /(Root directory) 아래에 두고 있으며 각 디렉토리의 역할은 다음과 같다.

      • /(root directory): 전체 파일 시스템 계층의 기본(최상위) 계층 디렉토리
      • bin: 사용자 모드에서 사용 하는 필수 명령 바이너리(Binariy) 파일을 보관 (예 : cat, ls, cp 등의 명령 파일을 보관)
      • boot: 부팅에 필요한 리눅스 커널 및 여타 패키지를 보관
      • dev: 저장장치, 사운드카드, 그래픽카드, USB장치 등의 시스템에 연결된 장치 관련 파일을 보관 (예: /dev/disk0, /dev/sda1, /dev/tty 등)
      • etc: 사용자 계정과 암호화된 패스워드를 비롯한 여러가지 설정 파일(편집 가능한 Text 파일)들을 보관
      • home: 각 계정의 홈 디렉토리 (각 개인의 파일과 설정 등을 보관)
      • lib: /bin에 저장된 Binary에 공유되는 필수적인 라이브러리를 보관
      • media: USB메모리, 외장형 CD 드라이브등 이동식 매체의 마운팅 지점
      • /root: root user의 홈 디렉토리
      • sbin: 필수 시스템 바이너리 파일들을 보관 (예 : fsck, init, route)
      • sys: 특별한 운영체제 파일(장치, 드라이버 및 일부 커널 기능)들이 있는 디렉토리
      • tmp: 임시 파일(시스템 재부팅 시 보존되지 않는 경우가 있음)들이 자동으로 보관 되는 곳
      • usr: 읽기 전용 사용자 데이터, (multi-)user(다중-사용자) 유틸리티 및 응용 프로그램의 대부분을 포함
      • var: 시스템이 정상적으로 작동하는 동안 내용이 계속 변경 될 수있는 가변 파일 (예: 로그, 스풀 파일 및 임시 전자 메일 파일 등)
    • 홈 폴더(Home Folder)
      • 홈 폴더(Home Folder)에 사용자 자신의 파일이 보관된다. Raspberry Pi에서 터미널 창을 이용하여 로그인하면 홈 폴더(사용자 이름이 pi 인 경우 /home/pi)에 위치한다.

      • 홈 폴더에 위치하기: cd와 Enter Key를 입력하면 /home/pi(홈 폴더)에 위치하게 된다.
      • 홈 폴더로 부터 상대 위치에 위치하기: ~(Tilde key)를 사용하면 홈 폴더로 부터 상대 위치에 쉽게 위치 할 수 있다. cd ~/Desktop/ 명령을 실행하면 /home/pi/Desktop 폴더에 위치하게 된다.
      • Root user로 로그인한 경우 홈 폴더는 /root/ 가 된다.
    • 중요 File(or Folder) Backup 하기
      • 중요한 파일을 정기적으로 백업(Backup)하여야 한다. 백업 대상은 사용자 파일, 구성 파일(Configuration files), 데이터베이스, 설치된 소프트웨어, 설정 및 시스템의 전체 스냅 샷 등이 될 수 있다.

      • 홈 폴더(pi Folder) 백업: /home/ 폴더에서 아래 명령으로 압축 파일(pi_home.tar.gz)을 만든 다음 다른 PC 또는 USB 등에 별도로 복사하여 저장 한다.
        • cd /home/

          sudo tar czf pi_home.tar.gz pi


  • 리눅스 명령어(Linux commands)
    • Raspberry Pi에서 공식 릴리즈하는의 OS인 Raspbian은 Debian(리눅스 기반 OS)을 기반으로 만들어졌기 때문에 Raspberry Pi를 바르게 사용하기 위하여는 리눅스 기본 명령어를 이해 하는 것이 중요하다.

    • 리눅스 기본 명령어 요약
    • 파일시스템(File system) 관련 명령어
      • ls: 현재 디렉토리(또는 지정된 디렉토리)의 내용을 한다. -l Flag와 함께 사용하면 각 파일 및 디렉토리에 대한 추가 정보(권한, 소유자, 그룹, 크기, 날짜 및 시간 소인)를 목록 형식으로 표시 할 수 있다. -a Flag를 사용하면 . 로 시작하는 파일을 볼 수 있다.
      • cd: 작업 디렉토리를 지정된 dir로 변경한다. 절대 경로 또는 상대 경로를 사용(예 : cd /home/pi/directoryA 또는 cd ../) 할 수 있다.
      • pwd: 현재 작업 디렉토리의 이름을 표시 한다. Raspberry Pi에서 로그인 후 바로 pwd를 입력하면 /home/pi 가 출력된다.
      • mkdir: 새 디렉토리를 만든다. (예: mkdir newDir 명령은 현재 작업 디렉토리에 newDir 디렉토리를 새로 만든다.)
      • rmdir: 빈 디렉토리를 제거한다. (예: rmdir oldDir 명령은 oldDir 디렉토리가 비어있는 경우 제거한다.)
      • rm: 지정된 파일을 삭제한다.( -r과 함께 사용하면 디렉토리에서 재귀적(디렉토리 내의 파일과 디렉토리 모두를 삭제)으로 삭제). 이 방법으로 디렉토리를 삭제하는 경우 주의를 요함.
      • cp: 파일을 지정된 위치에 복사한다. 예:
        • cp fileA FileB : 현재 디렉토리의 파일 fileA를 fileB에 복사한다.
        • cp fileA /home/otherUser/ : 현재 디렉토리의 파일 A를 /home/otherUser/ 디렉토리에 복사한다.
        • cp -r dirA dirB : 디렉토리의 내용을 재귀적으로 복사(디렉토리를 복사하는 경우에는 -r를 사용하여야 한다.
      • mv: 파일을 지정된 위치에 이동하여 배치한다. 따라서 cp는 '복사-붙여 넣기'를 수행하고 mv는 '잘라 내기-붙여 넣기'를 수행한다. 이 명령은 파일과 디렉토리를 만든 후 이름을 바꾸는 경우에도 사용할 수 있다.
      • cat(concatenate): 입력 파일을 출력 파일에 전송(출력) 한다. 예:
        • cat fileA : fileA를 표준 출력장치(모니터)에 출력한다.
        • cat > fileA : 표준 입력장치(키 보드에서 입력한 내용)의 내용을 fileA에 출력(새로운 Text file fileA가 만들어 진다.)한다.
        • cat fileA fileB > fileC : fileA 와 fileB를 연결하여(concatenate) fileC 에 출력(저장)한다.
      • chmod: 파일 또는 디렉토리의 접근권한을 변경(설정)한다.
        • 접근권한은 8진수로 사용자/사용자그룹/기타 사용자 순서로 chmod 명령에 표시한다.
        • 8진수의 3번째 Bit는 read(r) 권한, 2번째 Bit는 write(w) 권한, 1번째 Bit는 execute(x) 권한을 설정한다.
        • chmod 777 fileA : 모든 사용자에게 read, write, execute을 허용한다.
        • chmod 754 fileA : 사용자에게 rwx 권한, 사용자그룹에게는 rx 권한, 기타 사용자에게는 r 권한을 부여한다.
      • chown: 파일 소유자와 그룹을 변경한다. 이 명령은 sudo를 사용하여 root 권한으로 실행해야 한다.
        • chown {소유권자}:{그룹식별자} {소유권을 변경하고 싶은 파일명}
        • chown aaa:bbb fileA : fileA의 소유자를 aaa로하고 그룹은 bbb로 한다.
        • chown -R aaa:bbb dirA : 디렉토리 dirA와 dirA의 모든 하위 디렉토리와 파일(-R : 재귀적으로 소유권 변경)의 소유자를 aaa로하고 그룹은 bbb로 한다.
      • sudo: 명령을 사용하면 수퍼 유저 또는 다른 사용자로서 명령을 실행할 수 있다.
        • sudo apt update : Super user 자격으로 apt update 명령을 실행한다. root user의 password 가 필요하다.
      • &: 백그라운드(Background)에서 명령을 실행하도록 한다.
        • sudo executeFileName & : Super user(root) 자격으로 executeFileName 프로그램을 백그라운드에서 실행한다
        • Background에서 실행 중인 Process를 확인 하고 정지 하기
          • 다음 명령으로 Background 에서 실행 중인 Process PID를 확인 한다.
          • ps -A | grep (Process name)

          • 다음 명령으로 실행 중인 Process를 정지 한다.
          • sudo kill pid 또는 sudo kill -9 pid (pid는 ps 명령으로 확인한 node process의 pid 번호 임.)

    • 사용자(Users) 관리 명령어
      • passwd: 비밀번호 변경
        • passwd 명령어를 입력하고 메세지에 따라 현재 암호와 재 설정하려는 암호를 입력한다.
        • 현재 사용자가 sudo 권한을 갖고 있으면 다른 사용자의 암호도 아래 예와 같이 변경 할 수 있다.
        • sudo passwd userId

        • 현재 사용자가 sudo 권한을 갖고 있으면 아래 예와 같이 암호를 삭제 할 수 있다.
        • sudo passwd userId -d

      • adduser: 새 사용자 추가하기
        • 현재 사용자가 sudo 권한을 갖고 있으면 아래 예와 같이 암호를 삭제 할 수 있다.
        • sudo adduser userId

      • userdel: 사용자 삭제하기
        • 현재 사용자가 sudo 권한을 갖고 있으면 아래 예와 같이 사용자를 삭제 할 수 있다. -r Flag는 사용자의 home 폴더 까지 삭제한다.
        • sudo userdel -r userId

      • sudo: 수퍼 유저(Superuser: root) 권한으로 명령 실행하기
        • root 사용자는 Linux 시스템에서 컴퓨터의 거의 모든 자원에 접근 할 수 있는 특별한 사용자(Superuser) 이다. 일반 사용자는 다른 사용자의 폴더나 시스템 파일에 접근 할 수 없다.

        • 수퍼 사용자 권한이 있지만 일반 사용자로 로그인한 사용자가 root 권한으로 실행하여야 하는 명령을 실행하는 경우 아래 예와 같이 실행 한다.
        • sudo apt update

    • 탐색(Search) 관련 명령어
      • grep: 파일 내에서 특정 문자 패턴 탐색 하기
        • 아래 예에서는 현재 폴더에 있는 .txt 확장자를 가진 모든 파일에서 문자열 "search"를 탐색한다.
        • grep "search" *.txt

      • find: 파일 및 디렉토리 검색하기
        • 아래 예에서는 현재 디렉토리에 포함된 모든 하위 디렉토리 및 파일에서 지정된 파일(FILE_1)을 검색한다.
        • find . -name "FILE_1"

    • 네트워킹(Networking) 관련 명령어
      • ping: 다른 호스트와 통신 할 수 있는지 확인하는 데 사용한다.
      • ifconfig: 네트워크 인터페이스 정보를 확인하거나 설정한다.

  • Text editors
    • Desktop graphical editors
      • Text Editor
        • Raspbian Desktop을 사용할 때 보조 프로그램 메뉴에 텍스트 편집기를 실행하는 옵션이 있다. Ctrl + S와 같은 키보드 단축키를 사용하여 파일을 저장하고 Ctrl + X를 사용하여 종료 할 수 있다.

      • Thonny
        • Thonny는 Python REPL(Read Eval Print Loop) 및 IDE이므로 창에서 Python 코드를 작성 및 편집하여 실행할 수 있다. Thonny는 Python 3을 사용하고 별도의 창( window)과 구문 강조 기능를 가지고 있다.

    • Command-line editors
      • Nano Command-line editor
        • GNU Nano는 사용하기 쉬운 Text 편집기이다. Raspberry Pi에 기본적으로 설치되어 있으므로 아래와 같은 명령(fileName.txt 파일을 편집하는 예)을 사용하여 파일을 편집하고, Ctrl + O와 같은 키보드 단축키를 사용하여 저장하고, Ctrl + X를 사용하여 종료한다.

          nano fileName.txt

          참고자료: A Beginner’s Guide on How to Use Nano Text Editor in Linux


  • 자주 사용하는 기타 명령들
    • Shell scripts
      • 여러 줄의 명령을 파일로 작성하여 실행할 수 할 수 있게 한다.

        참고자료: Understand Linux Shell and Basic Shell Scripting Language

        아래 예 명령을 파일로 작성하여 실행하는 예 이다.

      • 본인이 좋아하는 Text editor를 사용하여 아래와 같은 파일(이 예에서는 파일 이름을 first-script로 함)을 작성한다.
      • echo First script file

        echo Hi, Raspberry Pi

        echo done

      • 아래 예와 같이 chmod 명령을 사용하여 first-script의 속성을 실행 가능한 파일로 변경한다.
      • chmod +x first-script

      • 아래 예와 같이 first-script 파일을 실행한다.
      • ./first-script

    • systemd: 리눅스를 위한 서비스 매니저
      • systemd는 리눅스를 위한 서비스 매니저(시스템 관리 데몬(Daemons), 유틸리티(Utilities), 라이브러리(libraries)를 포함)이다. 리눅스가 부팅 될 때 명령 또는 프로그램을 실행하기 위해 서비스를 추가 할 수 있다. 추가된 서비스는 Linux 프롬프트에서 start/stop 또는 enable/disable(재부팅시 자동으로 시작여부 설정) 할 수 있다.

      • Systemd의 중요 기능
        • 시스템 부팅 프로세스: 리눅스를 부팅(컴퓨터를 시작(동작)시키는데 필요한 프로그램이나 과정을 의미)하는 동안 이루어지는 이루어지는 초기화 프로세스
        • 서비스 관리(Service Management): 시스템이 부팅될 때 많은 서비스 데몬들이 실행되는데 그 중에는 필요 없어진 데몬(불필요한 데몬들은 시스템 자원을 낭비)을 실행되지 않도록 하거나 종료한다. 또는 추가로 필요한 데몬을 실행 하는 등의 관리를 한다.
        • 프로세스 자원관리: cgroup(CPU, Network, Memory 등 하드웨어 자원을 그룹별로 관리 할 수 있는 리눅스의 모듈) 이용
      • Systemd를 구성하는 중요 데몬
        • systemd : init 데몬(프로세스 대부분의 조상 프로세스이며 시스템 상태를 종합적으로 관리하는 역할)
        • systemd-journald : 다른 데몬(프로세스)들의 출력(syslog, 표준, 에러 출력), 로그 저장 데몬
        • systemd-logind : 사용자 로그인, 세션 등 관리 데몬
        • systemd-udevd : 장치 관리자 데몬
        • systemd-networkd : 네트워크 관리 데몬. DHCP(Dynamic Host Configuration Protocol) 뿐만 아니라 Virtual Lan 설정까지 가능
        • systemd-resolved : DNS(Domain Name System) 해석 데몬
        • systemd-timesyncd : NTP(Network Time Protocol)로 컴퓨터 시간 동기화 데몬
        • ssystemd-boot : UEFI(Unified Extensible Firmware Interface) 부트로더
      • 자주 사용하는 systemctl 명령
      • systemd 설정과 제어에 사용하는 명령이다. 아래 예는 Apache2 web server(웹서버 서비스)의 설정과 제어를 위한 명령 예 이다.

        • 실행 중인 서비스 보기
          • 실행 중인 모든 서비스 목록을 보려면 다음과 같이 명령한다.

            예: systemctl list-units --type=service

            윗 명령으로 실행 중인 Service를 확인하고 확인한 Service를 이용하여 아래 명령을 실행한다. 아래 예에서는 Apache2 web server가 설치되어 실행 중인 경우를 가정하였다.

        • 서비스 상태 확인 하기
          • Apache2 Service의 상태를 확인하는 명령 예

            예: systemctl status apache2.service

        • 서비스 시작, 중지, 재시작 하기
          • Apache2 Service를 시작, 중지, 재시작 하는 명령 예

            예: sudo systemctl start apache2.service

            예: sudo systemctl stop apache2.service

            예: sudo systemctl restart apache2.service

        • 부팅 시 서비스를 자동으로 실행 하기
          • 부팅 시 자동으로 httpd를 실행하도록 설정하는 명령 예

            예: systemctl enable apache2.service

        참고자료: How to Manage ‘Systemd’ Services and Units Using ‘Systemctl’ in Linux

        참고자료: How to Create and Run New Service Units in Systemd Using Shell Script

    • rc.local: Booting 시 명령 또는 프로그램을 실행하게 하기
      • 리눅스가 부팅 될 때 명령 또는 프로그램을 실행하기 위해 rc.local 파일에 명령을 추가 할 수 있다. 이 기능은 Pi를 전원에 연결하고 수동 시작 없이 프로그램을 실행하려는 경우에 유용하다. Raspberry Pi 부팅시 명령 또는 프로그램을 실행하는 다른 방법은 systemd를 참조하기 바람.

      • 아래 예와 같이 nano 편집기를 이용하여 rc.local 파일을 편집 할 수 있다.
      • sudo nano /etc/rc.local

        rc.local 파일을 열면 아래와 같은 내용이 보인다. 아래 내용의 ‘fi’ 와 ‘exit 0’ 사이에 본인이 실행하고자 하는 프로그램 실행 명령어를 입력 후, 저장을 하고 재 부팅한다.

        
        #!/bin/sh -e
        #
        # rc.local
        #
        # This script is executed at the end of each multiuser runlevel.
        # Make sure that the script will "exit 0" on success or any other
        # value on error.
        #
        # In order to enable or disable this script just change the execution
        # bits.
        #
        # By default this script does nothing.
        
        # Print the IP address
        _IP=$(hostname -I) || true
        if [ "$_IP" ]; then
          printf "My IP address is %s\n" "$_IP"
        fi
        
        exit 0
               
      • rc.local 파일내의 명령이 계속 실행되거나(예: 무한 루프를 실행 등) 종료되지 않는 명령인 경우 아래 예와 같이 명령 끝에 앰퍼샌드(&)를 추가하여 프로세스를 백그라운드에서 실행하여야 한다. 그렇지 않은 경우 명령이 계속 실행되어 boot 과정이 진행되지 않을 수 있다.
      • 가능한 파일의 위치는 절대번지(예: /home/pi/node-web/hello-express.js)로 설정하여야 한다.
      • 모든 명령은 root 사용자에 의하여 실행된다. 예를 들어, 스크립트에서 mkdir 명령으로 폴더를 만드는 경우 폴더는 root 소유권을 가지며 root 사용자 이외의 다른 사람이 액세스 할 수 없다.
      • node web 서버 hello-express.js를 Raspberry Pi 부팅시 자동으로 실행하는 예
        • Raspberry Pi에 Node.js를 이용한 Raspberry Pi Webserver 를 참고하여 Express를 설치한다.
        • Raspberry Pi에 node-web 폴더를 만들고 여기에 편집기를 이용하여 hello-express.js를 아래 내용으로 작성한다.
        • 
          const express = require('express')
          const app = express();
          
          app.get('/', (req, res) => {
            res.send('Hello World!')
          });
          
          app.listen(2600, () => {
            console.log('Example app listening on port 2600!')
          });       

          위에서 Listen port 번호(2600)는 외부에서 Raspberry Pi Webserver에 접속하는데 사용하는 번호로(적당한 번호로 변경하여도 됨) 외부에서 접속하는 경우 공유기에서 포트포워드 설정을 하여야 한다.

        • hello-express.js를 실행(명령 예: node hello-express.js)하고, chrome 브라우저를 이용하여 접속(예: http://[RaspberryPi_IP]:2600)하여 브라우저에 Hello World! 가 출력되는지 확인한다.
        • Raspberry Pi에서 아래 명령으로 nano를 열고 ‘fi’ 와 ‘exit 0’ 사이에 "sudo node /home/pi/node-web/hello-express.js & " 명령을 삽입하고 저장한다.
        • sudo nano /etc/rc.local

        • Background에서 실행 중인 Process를 확인 하고 정지 하기
          • 다음 명령으로 Background 에서 실행 중인 Process PID를 확인 한다. 윗 예에서 실행 프로그램 이름은 hello-express.js 이지만 실행 Process 이름은 node 임.
          • ps -A | grep (Process name)

            예: ps -A | grep node

          • 다음 명령으로 실행 중인 node Process를 정지 한다.
          • sudo kill pid 또는 sudo kill -9 pid (pid는 ps 명령으로 확인한 node process의 pid 번호 임.)


  • Software 설치하기
    • APT(Advanced Packaging Tool)
      • APT는 Linux 계열의 소프트웨어를 관리(설치, 업그레이드 및 제거)하는 툴이다. 소프트웨어가 데비안으로 패키지되어 있고 Raspberry Pi의 ARM 아키텍처에서 작동하는 경우 Raspbian OS에서 사용할 수 있다.

        참고자료: 15 Examples of How to Use New Advanced Package Tool (APT) in Ubuntu/Debian

      • 패키지를 설치하거나 제거하려면 root 사용자 권한이 필요하므로 사용자는 슈퍼유저 권한이 있거나 root로 로그인해야 한다.
      • 새 패키지를 설치하거나 기존 패키지를 업데이트하려면 인터넷에 연결되어 있어야 한다.
      • APT는 Pi의 소프트웨어 소스 목록을 /etc/apt/sources.list 파일에 보관하고 있기 때문에 소프트웨어를 설치하기 전에 아래의 예와 같이 apt update 명령을 사용하여 패키지 목록을 업데이트해야 한다.
      • sudo apt update

      • 아래 예는 tree Package를 설치하는 명령 예 이다.
      • sudo apt install tree

      • 아래 예는 APT를 사용하여 Package를 제거(Uninstalling)하는 예 이다.
      • sudo apt remove tree