cron과 printf에 관한 미스터리.....

systemfile의 이미지

프로그래밍중에 생긴 Mr.Lee입니다....
이 문제를 다른 사람에게 물어야 하나 말아야 하나 무척이나 고민을 많이 했습니다.(....)
아무리 생각해도 바보같은 질문이거든요..;;;

그래서 그냥 이렇게 자게에 푸념식으로 써봅니다;;;

ProC으로 프로그램을 만들었습니다.
cron에 걸어서 5분마다 데이터를 가공해서 DB에 값을 넣어주는 행동을 하는 프로그램이였더랩니다.

아주아주 잘 돌아갔었더랬죠.

비슷한 프로그램이 필요해서 이 놈에 if문 몇개랑 쓸때없이 뱉어내는 로그를 삭제하고 쿼리문을 조금 변경하고
손수 잘도는 것을 확인하고 cron에 걸었습니다.

그런데 안도는거에요!!!!

손으로 돌리면 잘 돌아가는 것이 cron에 걸면 안도는 희귀한 일이 일어나는 것이였어요;;;
ProC으로 짠 프로그램은 gdb로 따라가는 것이 힘들기에 printf문을 이용해서 로그를 찍기로 하였습니다.

단순하게 printf 문을. 넣었을 뿐인데...
cron에서 프로그램이 돌기 시작했습니다.
printf문을 빼면 안돌고.... 넣으면 돌고...

프로그램을 이리보고 저리봐도.. 이상한것을 못찾아서 결국에는..
지금은 프로그램 안에 printf("");를 넣어두고 돌리고 있습니다...

아아..이 미스터리한 일은 대체 왜 일까요....
주변에 물어봐도 답해주는 사람이 없고...

아아...

kldp에는 미스터리 게시판은 없는건가요..?

MasterQ의 이미지

테스트 소스 (분량이 너무 많다면 같은 문제가 repro 되는 예제 소스)를 올려주시거나 아니면 gcc -E 로 compile해서 실제 compile되기 전의 소스를 비교해서 분석해보세요. embedded처럼 timing에 민감한 문제가 아니라면 precompile쪽에서 문제될 가능성이 높아보이네요.

-> 아 그리고, 이런 문제는 흔하게 있습니다. (진짜 미스터리처럼 느껴지는것들도 있긴 하지만요..)

peccavi의 이미지

이맘때쯤 등장하는 스컬리,

"멀더, 과학적으로 증명되지 않는 프로그램 이상현상은 없어요."

----
jai guru deva om...

----
jai guru deva om...

codebank의 이미지

하하~ 제가 경험했던 문제같은데...

그런 이상한 현상이 있었는데 해결했었죠. 이런문제는 ProC뿐만아니라 네트워크 문제에서도
심심찮게 발생했던 부분이었는데 어디에서도 해결책이 없었죠.
그러다가 결국 printf()함수의 의미를 생각해봤습니다.
printf()함수가 결국은 어딘가에다(주로 화면이겠죠.) 출력을 하는 함수인데 화면의 경우
바로바로 출력이 가능해야합니다.
제가 기억하고 있는것이 맞다면 출력 버퍼는 어느정도 크기가 있고 UNIX에서 그 크기가 찰때까지
대기하고 있다가 그 크기가 넘어가면 그때가서 쓰기를 시도한다고 알고있습니다.
그런데 이 출력버퍼란놈들이 서로 상호 연관이 되어있는지(찾아보지는 않았습니다.) 파일로든
화면으로든 일단 flush를 해주면 다른 버퍼들까지 비어진다는 것을 경험으로 알게 되었습니다.
(이부분은 예전에 UNIX의 FILE처리에 부분에서 읽었던것 같은데 기억력이 좋지 않아서 긴가민가
한부분입니다.)

어쨌든 그래서 제 경우에는 printf ()함수가 들어가는 부분에 간단하게

fflush (stdout);

으로 처리함으로써 문제를 해결했던 기억이 납니다.(네트워크 부분도 동일...)
위에 주저리 주저리 써 놓았지만 실제로 내부에서 저런 동작때문에 그런 현상이 일어나는지는
잘모르겠습니다. 다만 몇년간 경험해본결과 대충 저런 이유이지 않을까해서 적어놓았습니다.
그리고 혹시나 제가 생각한 것이 틀렸다면 어디부분이 틀렸는지 들어보고 싶어서 적어 놓았습니다.
진짜 아무도 모르는건지 아니면 알면서도 쉬쉬~하고 있는건지도 궁금하고요. :-)
------------------------------
좋은 하루 되세요.

------------------------------
좋은 하루 되세요.

jachin의 이미지

답을 검증해 줄 사람이 푸념만 남겨놓고 갔으니,

좋은 답글엔 표시해두고 가는게 좋을것 같아서...

(아니... 이미 아는 분들은 읽으시면서 뭐가 정답인지 아셨을지도...)
====
( - -)a 이제는 학생으로 가장한 백수가 아닌 진짜 백수가 되어야겠다.

IsExist의 이미지

1. cron 상에서 $PATH, $LD_LIBRARY_PATH 등을 찍어 봅니다.
아니면 실행시키는 프로그램 내에서 /tmp/a.log 파일등으로 getenv() (혹은 main의
*env[] 변수를 이용)로 내용을 찍어봅니다.

2. cron 상에서 truss, strace, trace 로 같이 실행해 봅니다. 참조[http://kldp.org/node/900]
출력 내용을 저장하기 위해 tee 등으로 출력 리다이렉션을 하세요.

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치