반응형


00. 링크


[DVR] 집에서 놀고 있는 컴퓨터로 DVR을 만들어보자 #1

[DVR] 집에서 놀고 있는 컴퓨터로 DVR을 만들어보자 #2 - V4L2로 스트리밍 하기

[DVR] 집에서 놀고 있는 컴퓨터로 DVR을 만들어보자 #3 - RTSP 클라이언트 

[DVR] 집에서 놀고 있는 컴퓨터로 DVR을 만들어보자 #4 - CVLC 자동실행 <= (현재글)

[DVR] 집에서 놀고 있는 컴퓨터로 DVR을 만들어보자 #5 - DDNS와 Port Forwarding 설정

[DVR] 집에서 놀고 있는 컴퓨터로 DVR을 만들어보자 #6 - ffmpeg와 crontab을 이용한 녹화 기능 구현

[DVR] 집에서 놀고 있는 컴퓨터로 DVR을 만들어보자 #7 - 녹화 영상에 시간 넣기




01. 개요



2편(http://blog.kunwoo.pe.kr/130)에서 아날로그 캠으로 입력 받은 영상에 대해 RTSP 형식의 스트리밍을 하기 위한 CVLC 커맨드를 하기와 같이 완성 시켰다.



cvlc "v4l2:///dev/video0" --v4l2-input=0 --v4l2-standard=MN --live-caching=300 --sout=#transcode'{vcodec=h264,scale=자동,acodec=mpga,ab=128,channels=2,samplerate=44100}:rtp{sdp=rtsp://:8554/test.sdp}' --sout-keep


터미널에서 위의 커맨드를 실행한 후, 3편(http://blog.kunwoo.pe.kr/131)에서 소개한 방법으로 스트리밍 된 영상을 확인할 수 있었다.

이번 포스팅은 DDNS 와 Portforwarding 을 이용한 외부 접속관련하여 작성을 하려고 하였지만, 시스템을 정리하던 중 비중을 크게 두지 않았던 "cvlc 자동 실행" 관련하여 무한 삽질이 발생하여, 그 내용을 정리해 보고자 본 포스팅을 진행한다.


02. 리눅스(Linux Mint 19 Tara)에서 부팅 시 특정 스크립트 자동 실행 방법



윈도우에는 친절하게 시작프로그램이란 곳이 있어서, 윈도우 부팅과 동시에 실행하고 싶은 프로그램 혹은 배치파일이 있을 경우 시작프로그램에 추가를 하기만 하면 된다. 하지만, 리눅스에서는 부팅 시 프로그램 자동시작에 대해서 등록을 하기 위해서는 다양한 방법이 사용되어질 수 있고, 배포판마다 조금씩 다른 형태를 취하고 있다.




이러저러한 이유로 필자가 주로 많이 사용하는 방법은 crontab 을 이용하는 방법이다. 물론 crontab는 운영체제 부팅의 맨 마지막에 실행되는 것으로 부팅 중 어떠한 내용을 판단하여 실행할 내용이 있다면, crontab을 사용하면 안된다.

필자가 완성한 cvlc 커맨드는 부팅의 맨 마지막에 실행되어도 크게 문제가 없는 부분으로 간단하게 crontab을 사용하기로 결정한다.

[그림1] crontab 시작 명령어 등록 #1[그림1] crontab 시작 명령어 등록 #1


crontab 을 사용하는 방법은 아주 간단하다. -e 옵션을 통해서 원하는 명령을 적어놓고 저장을 하기만 하면 된다. "crontab -e" 를 터미널에서 실행한다.


[그림2] crontab 시작 명령어 등록 #2[그림2] crontab 시작 명령어 등록 #2


보통 crontab 을 처음 사용하는 컴퓨터에서는 crontab에서 사용할 에디터를 선택하는 화면이 먼저 나오게 되는데, 필자는 vim 을 선택하였다. 

crontab 을 Linux 유저들이 활용하는 이유는 어떠한 데이터 혹은 프로그램을 주기적으로 처리 또는 실행하기 위함이다. 따라서 다양한 형식과 옵션들이 있는데, 필자는 부팅 시 자동실행을 위해서 @reboot 라는 옵션을 사용했다.

[그림2]와 같이 @reboot 명령 을 적어놓으면, 부팅이 될 때마다, 해당 명령이 실행된다.

필자는 /home/junwrap/ 디렉터리에 video1Start.sh 라는 쉘스크립트를 작성해 놓았다.(video1Start.sh 는 위에서 완성한 cvlc 커맨드이다.)

[그림3] video1Start.sh[그림3] video1Start.sh


[그림3] 과 같이 쉘 스크립트를 작성하게 되면, 실행 권한을 줘야 하는데, 필자는 간단히 "sudo chmod 755 video1Start.sh" 명령으로 스크립트의 실행권한을 설정하였다.

[그림3] 에서 만들어진 스크립트가 잘 실행되는지 확인하고, RTSP 영상도 client에서 확인을 하였다. 컴퓨터의 재부팅을 통해, crontab 명령이 잘 이루어 졌는지 확인한다.





03. 문제발생 및 해결




03-01. crontab 디버깅


재부팅을 했는데, cvlc 를 통한 스트리밍이 전혀 되고 있질 않는다. 부팅 중 crontab 명령이 잘 이루어졌는지 /var/log/syslog 파일을 확인해 본다.


[그림4] /var/log/syslog 화면[그림4] /var/log/syslog 화면


syslog에 의하면 CRON이 /home/junwrap/video1Start.sh 을 잘 실행한 것으로 나온다. crontab 은 정상실행 된 것이다. crontab은 너무 단순해서 crontab 에서부터 잘못될 것이 크게 없다.

스크립트가 실행이 되었다면, 분명 vlc 프로세스가 살아있을 것이다. "ps -Af | grep vlc" 명령어로 확인해 본다.

[그림5] vlc 프로세스[그림5] vlc 프로세스


[그림5] 와 같이 vlc 프로세스가 잘 실행되어있다. 심지어 스크립트에 적어놓은 파라미터까지 잘 실행 된 것으로 보인다. 일단, 스트리밍이 되질 않고 있으니 프로세스를 kill(sudo kill 1736) 하여 vlc 프로세스를 죽이고, /home/junwrap/video1Start.sh 을 실행해 본다.

휴대폰에서 스트리밍 영상을 확인해 보니, 정상동작을 한다.

그렇다면 crontab 으로 video1Start.sh 을 실행하는 과정에서 어떠한 문제가 발생한 것으로 보인다. video1Start.sh 파일은 단순히 cvlc 에 파라미터를 넣어 실행한 스크립트이므로, vlc 단에서 디버깅이 이루어져야 한다.





03-02. vlc 디버깅



vlc의 디버깅을 위해서는 vlc 상에서 몇 가지 설정을 해 줘야 한다.

우선 X윈도우 상에서 vlc 를 실행한다.

VLC의 메뉴에서 [그림6]과 같이 도구->환경설정으로 진입한다.

[그림6] VLC 환경설정 진입[그림6] VLC 환경설정 진입


[그림7] VLC 세부 환경설정 진입방법[그림7] VLC 세부 환경설정 진입방법


[그림6]에서 환경설정에 진입을 하게되면, [그림7]과 같은 창이 뜨게 되어있는데, 왼쪽 하단의 설정보기에서 "전체" 를 선택하여 [그림8]과 같은 화면이 나오도록 진행한다.


[그림8] VLC의 기록도구[그림8] VLC의 기록도구


고급 환경설정에서 "고급->기록도구" 를 선택하면 파일 로거 설정이 오른쪽에 표시가 된다. "로그를 파일에 저장하기" 를 체크하고, 파일명(저장위치 및 파일명), 로그형식(텍스트), 상세출력(디버그)을 [그림8] 과 같이 설정하고, 오른쪽 하단의 저장버튼을 클릭한다.

[그림6][그림7][그림8] 의 순서대로 설정을 하면, vlc(cvlc)에 대한 모든 기록이 설정한 위치에 파일로 저장된다.

위와 같이 설정이 끝났으면, 재부팅을 진행 해 본다. 부팅이 완료 되었을 때, vlc의 로그를 열어본다.




[그림9] vlc error[그림9] vlc error


기록된 vlc의 로그를 확인해 보니, 범인이 포착되었다. v4l2 를 실행하기 위해, video 장치를 Open 하게 되는데, 이때, 권한문제로 /dev/video1 을 open 하지 못한다는 에러가 포착된 것이다.

로그를 살펴본 결과 문제의 증상이 딱 맞아 떨어진다. vlc 프로세스는 살아있지만, rtsp client 에서는 영상을 확인할 수 없는 현상이다. 

crontab 으로 cvlc의 실행까진 정상적이었지만, cvlc의 파라미터를 적용하는데 있어서, /dev/video1 을 Open 하지 못하니 rtsp 로 스트리밍할 데이터가 없었던 것이다.


03-03. /dev/video 의 권한설정(문제해결)



다행히도, permission 문제는 /dev/video1 의 권한을 살펴보면 쉽게 해결 될 수 있는 문제이다.


[그림10] /dev/video0 의 소유 group 확인[그림10] /dev/video0 의 소유 group 확인


"ls -l /dev/video0" or "video1" 의 명령으로 /dev/video0 에 대한 소유그룹을 확인한다.

crontab 에서 cvlc를 실행하는 user가 "video" 라는 그룹에 속해있어야 할 것으로 보인다. 사실 crontab 은 root user 권한으로 실행되기 때문에 video 그룹에 속해있지 않아도 크게 문제가 되지 않는다. 하지만, vlc 는 root user 권한으로 실행되지 않는다. 따라서, [그림1]에서와 같이 junwrap 계정으로 로그인된 상태에서 sudo 없이 crontab -e 명령으로 추가를 했기 때문에 junwrap 권한으로 cvlc 가 실행되었을 것이다. 따라서, video 그룹에 junwrap user 를 등록해 주면 간단히 해결 될 것으로 보인다.

"sudo vi /etc/group" 명령으로 group 파일을 직접 수정해 본다.

[그림11] /etc/group[그림11] /etc/group


video 그룹을 찾아 junwrap user 를 추가해 준다. [그림11]은 video group 을 찾은 것이고, "video:x:44:junwrap" 으로 수정을 해야한다.





04. 마무리



문제를 알고나면 쉽게 해결될 문제이지만 문제를 알기 까지 찾아가는 과정이 무한 삽질의 연속이다. 문제를 찾아가는 과정을 순차적으로 차근차근 해 보게 되면 정답을 구할 수 있게 되지만, 그 과정 자체를 제대로 이해하지못하여 인터넷으로만 어떤 정보를 찾고자 한다면 문제가 해결되지 않을 가능성이 높다.

평소에 아무생각없이 사용했던 방법들이 갑자기 작동되지 않는다면 당황하기 마련이다. 이번 포스팅에 공유된 내용도 필자는 당연히 될 것이라고 생각했지만, cvlc와 /dev/video 조합에서의 권한문제로 crontab 에서는 문제가 발생한다는 것을 새로 알게 된 부분이다.

Linux 라는 OS 가 워낙 삽질을 많이해야만 내 것으로 만들 수 있는 것이다 보니, 필자가 Linux 를 만지는한 삽질은 계속될 것으로 보인다.

다음편에서는 3편에서 예고했던 것과 같이, 공유기에서 DDNS와 Portforwarding 설정으로 외부 접속이 가능할 수 있도록 설정하는 방법을 공유할 예정이다.


1편 링크 : ([DVR] 집에서 놀고 있는 컴퓨터로 DVR을 만들어보자 #1)

2편 링크 : ([DVR] 집에서 놀고 있는 컴퓨터로 DVR을 만들어보자 #2 - V4L2로 스트리밍 하기)

3편 링크 : ([DVR] 집에서 놀고 있는 컴퓨터로 DVR을 만들어보자 #3 - RTSP 클라이언트)

5편 링크 : ([DVR] 집에서 놀고 있는 컴퓨터로 DVR을 만들어보자 #5 - DDNS와 Port Forwarding 설정)

6편 링크 : ([DVR] 집에서 놀고 있는 컴퓨터로 DVR을 만들어보자 #6 - ffmpeg와 crontab을 이용한 녹화 기능 구현)

7편 링크 : ([DVR] 집에서 놀고 있는 컴퓨터로 DVR을 만들어보자 #7 - 녹화 영상에 시간 넣기)


2018년 12월 02일
Kunttang








반응형
블로그 이미지

매깡

- 각종 문의는 메일로 해주세요. 메일: soriel01@nate.com

,