기본 콘텐츠로 건너뛰기

라벨이 linux인 게시물 표시

쉘 스크립트 기초 예제 (선언, 조건문, 변수)

꽤 잛은 주기로 실행되는 cron이 있는데, 앞놈이 실행중이면 SKIP하는 cron을 예제로 스크립트 기초(?) 정리 #!/bin/sh PS_CHECK= `ps -ef | grep {프로세스구분자} | wc -l` echo $PS_CHECK if [ "$PS_CHECK" -gt 1 ] ; then exit fi ./run_cronScript.sh #!/bin/sh 해당 스크립트를 어떤 쉘에서 실행하는지를 설정. PS_CHECK= `ps -ef | grep {프로세스구분자} | wc -l` PS_CHECK가 변수임. 변수선언할때 var, int, String 같은 별도의 변수타입을 선언이 필요 없다. 변수와 value 사이 (=) 앞뒤에 공백이 있어서는 안된다. 시작과 끝 기호는 (')가 아니라 (`)거임. 숫자 1 앞에 있는 버튼 if [ "$PS_CHECK" -gt 1 ] ; then exit fi if문은 fi문으로 끝난다. if문의 조건문은 []를 사용하는데, 괄호 앞,끝에는 공백이 존재해야 한다. 변수를 사용할때는 앞에 ($)를 붙인다. 잡설. 코딩을 어느정도 하다보면 새로운 언어라 하더라도, 어떤 기능을 하는 함수인지 감은 대충 오곤한다. 그런나 막상 작성(write)을 하려면 엄한곳에서 애먹는 경우가 있다. 쉘 스크립트에서는 (=) 앞뒤 공백, (`), if문 안에 공백에 주의하자.

[linux] : bad interpreter: 그런 파일이나 디렉토리가 없음

* 발생이유 현재 서버의 환경과 실행할 쉘 스크립트 파일이 호환이 되지 않아 발생 해당 스크립트 파일을 vi의 바이너리 모드로 열어보면 vi -b test.sh ^M <- 이문자가 행 끝마다 붙어있는게 보인다. 그래서 저문자를 지워야 해결이 되는데, 보이는데로 꺽쇠 + 대문자 M 을 적으면 해결이 되지 않는다. 대신 Ctrl + v + m 으로 입력을 해야 한다. 일일이 찾아서 지울수는 없으니 아래처럼 치환 명령을 통해 ^M을 삭제하면 해결. :%s/^M$//g

rm 명령어 옵션

rm --help -f : 삭제할거냐고 물어보면서 프롬프트 띄우는 거 없음. 걍 진행, -i : 삭제할거냐고 매번 프롬푸트 띄우면서 물어봄. -r : 하위폴더 포함 삭제 -v : 삭제결과 일일이 보여줌 보통 alias에 rm rm -i 가 되어있어서 옵션없이 진행하면 -i 옵션 사용한것과 동일하게 진행 됨. 그리고 맨 마지막 문장 보면, rm으로는 삭제해도 복구가 되나봄, 그래서 제대로 정말 삭제하려면 ' shred '라는 명령어를 사용.

[linux] 백그라운드 작업 nohup [xxx.sh] &

백그라운드 작업이 필요할 경우가 있을 수 있다. 1. 데몬형태로 뭐를 띄운다거나, 2. cpu 많이 안잡아먹는데, 실행이 겁나 오래 걸리는. (예를들면, 10g짜리 압축을 푼다거나 뭐 이런거. ㅋ ) 보통 명령어 뒤에  & 만 붙여도 백그라운드로 작업을 한다. test . sh & 그런데 이럴경우 사용자가 터미널 세션이 끊어버리면 백그라운드 중인 작업도 같이 종료되어 문제가 발생할 소지가 있다. 그래서 이럴때 쓰는 명령어 nohup nohup ./test.sh & 저러면 쉘이 실행 되면서 몇 초 정도 깜박거리거나, 해당 로그가 떨어지다가 곧 프롬프트 상태로 돌아온다. nohup 확인 그리고 나서 ps -ef 해주면 test.sh 가 떠있는걸 확인할 수 있다. nohup 종료 종료하는 방법은 따로 없다. ctrl+c, ctrl+d 백날 눌러봐야 소용없다. ㅋ ps -ef 로 해당 쉘 pid 확인해서 kill로 종료시키면 된다. kill [pid of test .sh] nohup 로그 nohup으로 실행된 쉘 스크립트는 자동으로 nohup.out   이라는 이름으로 nohup을 실행한 위치에 자동으로 생성된다.

[linux] 모든 cron 확인

예전에 만들어놓은 cron이 요새 안돌고 있어서 찾아봤다. 물론 내가 만들었던 아니고ㅋ crontab -l no crontab for root 헐, 내가 찾던 cron이 안보인다. 분명히 예전 사수가 여기다 작업 해놓은것 같았는데... cron이 뭐하는 놈인지는 알아도, 어떻게 생겨먹은놈인지는 몰랐다ㅋ 이리저리 폴더 뒤져서 그때 스크립트 파일을 찾아보기 시작했다. 멍청한짓을 한 참 한후에 혹하는 마음에 로컬 사용자 뭐있나 찍어봄 cat /etc/passwd 찍어보믄 계정별로 결과가 쭈루루룩 나오는데, 뜻은 이거다. 계정:암호:UID:GID:정보:디렉토리:쉘 passwd 파일 설명은 ( http://www.linuweb.com/?p=248 ) 여기 님 블로그에 잘 되어있음. 암튼 결국 계정별로 cron 걸려있는거 죄다 찍어보니 for user in $(cut -f1 -d: /etc/passwd); do echo id $user; crontab -u $user -l ; done 한번에 다찍어주는 명령어는 따로 없나보다. 간단하게 스크립트로 찍어주는 수밖에. 결국 내가 찾던 cron은 처음보는 계정에 들어있었음. 그리고 cron이 안돌던 이유는 ftp가 막혀서였고 ㅋ