터미널에서 한두 시간쯤 걸리는 긴 작업을 시작했고, 난 모니터에서 눈을 떼고 싶을 때 가장 좋은 방법은? 일이 끝나면 알림 소리를 내는 것이다.
터미널에서 알림 소리 내기
비프음을 내는 프로그램으로 beep
가 있긴 한데, 이게 스피커를 이용하는 소리가 아니다 보니 요새 컴에서는 거의 작동하지 않는다고 한다. 그래서 alias를 만들었다.
~/.bashrc
를 열고, alias를 만들자. 파일 맨 밑에 아래 줄을 넣는다.
alias beep='paplay /usr/share/sounds/freedesktop/stereo/complete.oga'
beep
라고 치면 뒤에 쓴 paplay ...
부분이 실행되게 하는 건데, 당연히 paplay
프로그램과 complete.oga
라는 파일이 없으면 실행되지 않는다. 자기 환경에 맞게 하자. 난 우분투 16.04에서 했는데 기본으로 있더라.
.bashrc
를 갱신해야 하니 터미널을 나갔다가 다시 들어오거나, 아래 명령어를 친다.
. ~/.bashrc
방법1. 애초에 명령을 내릴 때 써 둔다
애초에 명령을 내릴 때 알림 소리를 내게 하는 방법이 제일 간편하겠지.
명령 ; beep
위처럼 하면 명령을 실행한 뒤, 해당 명령이 끝나면 beep
를 실행한다.
방법2. 이미 명령을 내린 뒤 깨달았다면?
애초에 이 글을 쓴 게, 내가 한두 시간 걸릴 작업을 실행한 뒤 알림 소리를 냈으면 좋겠다고 생각해서였다.
우선, 현재 돌아가고 있는 프로그램의 pid(process id)를 찾는다. 나는 php fix.php
라는 명령을 내린 상태였으니 아래처럼 해서 찾았다.
ps aux | grep php
결과물은 아래와 같았다.
mytory 4434 0.2 0.9 362620 76008 pts/1 S+ 00:36 0:09 php fix.php --all
pid가 4434라는 것을 알 수 있다. 두 번째 열이 pid다.
사실 grep
없이 ps aux
만 치면 pid를 나타내는 열이 몇 번째 열인지 알 수 있다. 너무 많이 나오니 ps aux | less
해서 맨 위부터 봐라(less에서 빠져나오려면 q를 누르면 된다). 아님 ps aux | head
해서 맨 위에 10줄만 나오게 하던가.
pid를 확인했으면 아래처럼 명령줄을 치자. 10초에 한 번씩 해당 pid가 존재하는지 확인하고 있으면 runnig이라는 메시지를 띄우고, 없으면 beep
명령을 실행하는 bash 스크립트다.
IS_RUNNING=1; while [ $IS_RUNNING == 1 ]; do if ps -p 4434 > /dev/null; then echo 'running'; else beep; IS_RUNNING=0; fi; sleep 10; done
위에서 4434를 자신의 pid로 변경하고 명령을 실행하면 된다. 10초에 한 번씩 하기 싫으면 그냥 sleep 10
에서 10을 자기가 원하는 초 수로 변경하면 된다. 1초에 한 번씩 검사하든가.
나중에 sh 파일로 만들어서 편하게 하고 싶지만 일단 지금은 귀찮다.
방법 2 해설
보면 while
문과 if
문의 조합이라는 걸 알 수 있을 것이다.
우선 IS_RUNNING
에 숫자 1을 할당한다. 그리고 while 조건에 $IS_RUNNING
이 참인지 검사하게 한다.
자, 다음 부분을 보자.
if ps -p 4434 > /dev/null
이 줄은 pid 4434가 있는지 확인하는 부분이다. ps -p
가 그 역할을 담당한다. > /dev/null
은 결과물을 출력하지 말고 날리라는 이야기다. /dev/null
은 파일이긴 한데, 파일이 아니다. 그냥 없애라는 뜻이다. 리눅스는 모든 것을 파일로 취급한다. 디바이스마저도. (dev는 device의 약자다.)
다음 부분인 then echo 'running'
은 pid 4434가 있으면 running이라고 출력하라는 뜻인 줄 알 거다.
그 다음인 else beep
는 pid 4434가 없으면 beep를 실행하라는 뜻인 줄 알 것이고.
다음 부분인 IS_RUNNING=0
은, beep
를 실행한 뒤 $IS_RUNNING
에 0을 할당해서 while문을 끝내도록 세팅하는 부분이다.
그 다음인 sleep 10
은 10초 동안 쉬게 하는 부분이고.
while문과 if문에 대한 설명은 생략했다.
응용
사실 비프음을 계속 울리게 하는 경우엔 변수 설정이 필요 없다. 그럴 땐 while 조건문 안에 그냥 1을 넣으면 된다. 조건과 [
, ]
사이에 공백을 꼭 둬야 한다는 사실을 잊지 마라.
while [ 1 ]
또, beep
를 넣는 대신 poweroff
나 shutdown -h 10
같은 명령어로 작업이 종료되면 컴퓨터를 끄게 할 수도 있다.
이 글 쓸 시간에 스크립트 파일 만들어서 코드에다 설명할 걸 그랬나. pid를 인자값으로 받게 하고… 에라 뭐. 만드실 분은 만들어서 메일로 보내 달라. 참고로 인자값을 받으려면 스크립트 파일 안에서 $1
, $2
하는 식으로 쓰면 된다. 이 부분은 더 자세한 설명은 생략하겠다.
여튼 여기까지.