Linux2015. 7. 16. 12:52

임베디드 시스템으로 뭔가를 하시려는 분들은 요즘 라즈베리파이 시리즈나 오드로이드 시리즈의 리눅스를 많이 쓰시니까 보드를 키자마자 프로그램을 자동실행하게 하는 경우가 많을 것 같습니다.


저도 쿼드콥터 위에 오드로이드C1를 올려서 자동주행 알고리즘 연구를 하고있는데, 리눅스 고급유저가 아닌지라 많이 헤메게 되네요 ㅠㅠ


보통 자동실행은 /etc/rc.local 파일에 실행시킬 프로그램 경로를 써서 하게됩니다.


/root/hsPi/wing &


이런 식으로 써두는데 &는 백그라운드로 실행하라는 의미입니다. 백그라운드로 실행시키지 않으면 부팅 중간에 저 프로그램을 실행했다가 부팅과정을 마저 못끝내는 현상이 발생하더라구요 (저 프로그램은 loop구조라 끝나지 않는 프로그램..)


보통 이렇게 자동실행을 등록해서 사용해왔습니다. 그런데!


오드로이드C1에 올린 리눅스 우분투에서 위처럼 자동실행을 등록해놨는데 두 번 실행되는 문제가 발생했습니다.


아두이노와 Serial통신을 일정 주기마다 일정 크기만큼 주고받는데, 프로그램 두개가 한번에 보내니 아두이노에서 못받는 현상이 생기더라구요


부팅 과정을 짚어봐도 도저히 고칠수가 없길래 그냥 프로그램이 이미 실행중이면 실행하지 말라는 쉘 스크립트로 해결했습니다. ㅜ 뭔가 찜찜한 기분..


리눅스 중복실행 방지로 검색하니까 좋은 소스가 있어서 사용중입니다.


#load date
date=$(date +%y/%m/%d-%H:%M:%S)

#해당되는 프로세스 ID 읽어오기 (read process id with file name 'takeOriginImage.php').
pid=`ps -ef | grep "takeOriginImage.php" | grep -v 'grep' | awk '{print $2}'`

#프로세스ID가 있을 경우, 즉 실행 중일 경우, 메시지를 출력하고 종료.
#If the process ID - that means if it is running, a message and exit.
if [ -z $pid ]
then
/usr/local/php/bin/php /home/jdk/takeOriginImage.php > /home/jdk/_log/takeOriginImage.txt
else
echo $data "can not dual exec process!!!\r\n";
fi


도움 - http://breezymoon.blogspot.kr/2013/09/shell-script-to-avoid-duplicate-runs.html





'Linux' 카테고리의 다른 글

OpenCV 2.4.9 on Ubuntu 14.04  (0) 2015.06.15
Posted by 너를위한노래