터미널에서 한두 시간쯤 걸리는 긴 작업을 시작했고, 난 모니터에서 눈을 떼고 싶을 때 가장 좋은 방법은? 일이 끝나면 알림 소리를 내는 것이다.

터미널에서 알림 소리 내기

비프음을 내는 프로그램으로 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를 넣는 대신 poweroffshutdown -h 10 같은 명령어로 작업이 종료되면 컴퓨터를 끄게 할 수도 있다.

이 글 쓸 시간에 스크립트 파일 만들어서 코드에다 설명할 걸 그랬나. pid를 인자값으로 받게 하고… 에라 뭐. 만드실 분은 만들어서 메일로 보내 달라. 참고로 인자값을 받으려면 스크립트 파일 안에서 $1, $2 하는 식으로 쓰면 된다. 이 부분은 더 자세한 설명은 생략하겠다.

여튼 여기까지.