반응형

리눅스에서 어떤 포트가 열려 있고 어떤 프로세스가 사용 중인지 확인하려면 netstat, ss, lsof 같은 명령을 사용합니다.

포트 충돌이나 서버 접속 문제를 볼 때는 먼저 listen 상태의 포트를 확인하고, 이어서 해당 포트를 점유한 프로세스를 찾는 순서가 실용적입니다.

 

핵심 정리

리눅스에서 포트 문제를 볼 때는 어떤 주소와 포트가 listen 중인지, 어떤 프로세스가 그 포트를 잡고 있는지, 외부에서 접근 가능한 바인딩인지 순서대로 확인하는 것이 좋습니다.

  • netstat과 ss는 현재 열려 있는 포트와 listen 상태를 확인하는 데 사용합니다.
  • lsof는 특정 포트를 점유한 프로세스 이름과 PID를 찾는 데 유용합니다.
  • 127.0.0.1에만 바인딩된 포트는 외부 호스트에서 직접 접근할 수 없습니다.
  • 0.0.0.0 바인딩은 모든 네트워크 인터페이스에서 대기한다는 뜻입니다.
  • 포트가 열려 있어도 방화벽이나 보안 그룹에서 막히면 외부 접속은 실패할 수 있습니다.

포트 장애는 listen 여부, 프로세스 점유, 바인딩 주소, 방화벽을 분리해서 보면 원인을 빠르게 좁힐 수 있습니다. 먼저 로컬에서 열려 있는지 확인한 뒤 외부 접근 경로를 확인하는 흐름이 안전합니다.

이어서 볼 글

 

netstat: listen 하고 있는 포트들 확인

$ sudo netstat -tln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 127.0.0.1:45249         0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:9868            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:9993            0.0.0.0:*               LISTEN

lsof를 쓰게 되면 어떤 프로세스인지 확인할 수 있다.

$ sudo lsof -i -P -n | grep LISTEN
systemd-r    2642 systemd-resolve   14u  IPv4    25307      0t0  TCP 127.0.0.53:53 (LISTEN)
redis-ser    2796           redis    6u  IPv4    32072      0t0  TCP 127.0.0.1:6379 (LISTEN)
docker-pr 1047663            root    4u  IPv4 31617983      0t0  TCP *:9993 (LISTEN)
docker-pr 1047671            root    4u  IPv6 31620897      0t0  TCP *:9993 (LISTEN)
반응형
반응형

안드로이드 저장소는 설정값, 앱 전용 파일, 다른 앱과 공유할 파일을 어디에 저장하느냐에 따라 선택지가 달라집니다.

SharedPreferences, 내부 저장소, 외부 저장소, SQLite, 네트워크 저장을 구분하면 파일 입출력과 권한 문제를 이해하기 쉬워집니다.

 

핵심 정리

SharedPreferences는 작은 설정값을 key-value 형태로 저장할 때 쓰고, 내부 저장소는 앱 안에서만 사용하는 파일을 저장할 때 적합합니다. 외부 저장소는 사진이나 공유 파일처럼 다른 앱과 함께 볼 수 있는 데이터를 다룰 때 사용하며, 권한과 경로 차이를 함께 고려해야 합니다. 구조화된 데이터는 SQLite를, 서버와 동기화해야 하는 데이터는 네트워크 저장을 선택합니다.

  • SharedPreferences는 작은 설정값이나 상태값을 저장할 때 사용합니다.
  • 내부 저장소는 다른 앱과 공유할 필요가 없는 앱 전용 파일에 적합합니다.
  • 외부 저장소는 사진, 문서처럼 앱 밖에서도 접근할 수 있는 파일에 사용합니다.
  • 외부 저장소는 기기와 버전에 따라 권한과 경로 처리가 달라질 수 있습니다.
  • SQLite는 테이블 구조가 필요한 데이터를 저장할 때 사용합니다.
  • 데이터를 여러 기기에서 공유해야 하면 네트워크 저장이나 서버 동기화를 고려합니다.

안드로이드 저장소를 고를 때는 먼저 데이터가 앱 전용인지, 사용자와 다른 앱이 접근해야 하는지, 구조화된 검색이 필요한지 나누는 편이 좋습니다. 저장 위치를 먼저 정하면 권한과 파일 입출력 방식도 자연스럽게 좁혀집니다.

가장 기본적인 저장소 개요는 여기를 참조

안드로이드 프로그래밍을 할 때 상태저장 또는 파일입출력, 파일공유 등을 위해 저장소 개념은 중요하다.

그런데 내부/외부 저장소가 있고 저장경로와 권한에 대해 신경써줘야 하는등, 데스크탑에서 하던 콘솔 프로그래밍 또는 MFC등의 application에 비해 복잡성이 좀 더 존재한다.

안드로이드에서 지원하는 저장소에는 다음 5가지가 있다.

1. SharedPreferences: 전용 원시 데이터를 [키, 값] 쌍으로 저장합니다.

2. 내부 저장소: 전용 데이터를 기기 메모리에 저장합니다.

3. 외부 저장소: 공용 데이터를 공유 외부 저장소에 저장합니다.

4. SQLite 데이터베이스: 구조적 데이터를 전용 데이터베이스에 저장합니다.

5. 네트워크 연결: 자신의 네트워크 서버를 사용하여 데이터를 웹에 저장합니다.

SharedPreferences

int, string 등에 대해서 설정값 저장하고 불러올 수 있다.

windows programming에서의 registry개념과 어느정도 유사하다.

내부 저장소

가장 기본적인 파일 입출력 형태라고 볼 수 있다.

다른앱과 공유할 필요없는 앱내부 자료 저장용으로 쓴다.

아래 처럼, app이 설치된 directory에서 Java파일 입출력을 할 수 있다.
자바의 파일입출력 API가 지저분한건 자바의 한계이니 감안하면서 보자 ㅠ

저장된 파일을 확인하는데는 아래 Device File Explorer를 쓰면 된다.

외부저장소

앱간에 공유할 정보가 있다면 이곳에 저장한다. 앱의 외부라는 측면에서 외부저장소라 부른다.

사진이 저장되는 Pictures폴더나 SD카드, USB스토리지등이 외부저장소에 해당한다.

예를들면 Pictures 폴더의 경우 아래처럼 접근해서 사용

 
공유공간을 사용하는 것이다 보니 권한이 필요하다.
아래처럼 manifest에 설정이 필요하다.

경우에 따라 아래코드가 추가로 필요할 수 있다.
 
 

단순히 Environment.getExternalStorageState() 라고만 했을때는, 외부SD카드 경로가 리턴될수도 있고, 내부 메모리의 일정영역이 리턴될수도 있다.

하드웨어 제조사 마음대로. 관련해서는 여기를 참조.

반응형

'Programming > Android' 카테고리의 다른 글

리눅스 포트 확인: netstat, ss, lsof 사용법  (0) 2020.06.06

+ Recent posts