[완료]crontab으로 실행했을때 소켓통신 오동작하는 문제입니다.(전체 소스, 전체Log 포함)
그냥 실행했을때랑 crontab으로 실행했을때랑 아래와 같이 로그가 다릅니다.
아래의 소스로 테스트해보았는데요..
그냥 실행했을때랑, crontab으로 실행했을때 log가 다르게 나옵니다.
mkfifo 명령으로 저의 home 디렉토리에 test_fifo 를 만들었습니다.
mkfifo /home/계정/test_fifo
결과 내용과, 소스를 한번 확인해 주세요..
crontab으로 실행했을때도 그냥 실행했을때랑 결과가 같게 나오게 할수는 없는걸까요..ㅠㅠ
int
main(int argc, char *argv[])
{
char test_fifo[256];
int tfd=-1;
int iReturn;
fd_set fds;
struct timeval tv;
int i;
sprintf(test_fifo, "%s/test_fifo", getenv("HOME"));
tfd = open(test_fifo, O_RDWR);
if(tfd == -1){
printf("tfd Open Fail\n");
}
else{
printf("tfd Open Success : %d\n", tfd);
}
for(i=0; i<3; i++)
{
FD_ZERO(&fds);
FD_SET(0, &fds);
FD_SET(tfd, &fds);
tv.tv_sec = 1; // interval : 1 sec
tv.tv_usec = 0;
iReturn = select(tfd+1, &fds, NULL, NULL, &tv);
printf("iReturn : %d\n", iReturn);
if(iReturn == 0)
{
printf("iReturn:0\n");
}
if(FD_ISSET(0, &fds))
{
printf("FD_ISSET(0, &fds)\n");
}
else if(FD_ISSET(tfd, &fds))
{
printf("FD_ISSET(tfd, &fds)\n");
}
else
{
printf("Unknown\n");
}
sleep(1);
}
return 1;
}
실행결과
바로 실행했을때 Log
tfd Open Success : 3
iReturn : 0
iReturn:0
Unknown
iReturn : 0
iReturn:0
Unknown
iReturn : 0
iReturn:0
Unknown
crontab으로 실행했을때 Log
tfd Open Success : 3
iReturn : 1
FD_ISSET(0, &fds)
iReturn : 1
FD_ISSET(0, &fds)
iReturn : 1
FD_ISSET(0, &fds)
음...
자세히는 안보이지만..왠지 이걸것 같아서 답올려봅니다.
crontab 실행시 환경변수와 shell login 했을때 환경변수 내역이 달라서 그럴듯합니다.
이 부분을 검색해보시면 될듯..
[KILL] 죽을각오로.........
[KILL] 죽을각오로.........
system("set")으로
system("set")으로 출력하여 나온 PATH및 모든 경로를 똑같이 맞췄는데도 똑같은 결과가 나타납니다.
달리 확인할 내용이 있을까요?
crontab 으로 돌릴 때도
crontab 으로 돌릴 때도 stdin 을 사용하고 싶다는 의도의 질문이라면
그것은 불가능하다라고 대답할 수 있겠습니다.
shell 에서 직접 실행테스트 하실 때 background 로 해보시면 되겠습니다.
stdin 이 없으므로 사용할 수 없습니다.
새로 만든 fifo 가 3 으로 잡히는 것은 0,1,2 가 stdin/out/err 로 존재하기 때문이 아니라,
호환성(donkey proof?)을 위해 0,1,2 에 의미없는 파일디스크립터(/dev/null)를 미리 할당하기 때문입니다.
daemon(3) 를 참고하세요.
OTL
이해가 잘 안되네요..
stdin을 사용할려는 의도가 아니라.
일단 질문내용에서 보이듯이 바로 실행했을때랑, crontab으로 실행했을때랑 실행결과가 달라서..
그 원인을 찾고 싶은건데요.
crontab을 사용했을때 select하면 값이 없는데도 if(FD_ISSET(0, &fds)) 여기에 걸리는 이유가 궁금한건데요.
위의 로그에서 확인할수 있듯이 둘다 fd는 3으로 나옵니다.
한국어 정말
한국어 정말 어렵습니다.
OTL
/dev/null
본문과 댓글보고 추측해보면...
쉘상에서 /dev/null 오픈한 fd는
1이 출력됩니다.
______________________-
크론 데몬에 의해서 실행되는 프로세스가
stdin, stdout, stderr의 file descriptor를
/dev/null을 open한 반환값을 갖는다면
위의 코드와 크론 데몬의 의해서 실행되는 프로세스 결과는
같은 상황입니다.
(위 코드 fd와 크론데몬 등록 프로세스 stdin은 같은
file descriptor (open("/dev/null"))에서
select 검출됨 , tfd 검출안됨)
결과적으로 /dev/null open한 file descriptor는
select에서 검출되는군요.
실제로 변화가 있어서 검출되는건지...
루틴상 바로 검출되는건지는.....^.^
아마도 glibc 코드확인해보면 바로 반환해주는 루틴이 있을듯하지만
그거까지 찾아볼 의욕은 안생기겠네요...
없음
open("dev/null", O_RDWR);
open("dev/null", O_RDWR); 로 했을때는
crontab으로 했을때 select의 결과값이 2가 출력되고 printf("FD_ISSET(tfd, &fds)\n"); 로 걸립니다.
shell에서 바로 실행했을때(open("dev/null", O_RDWR); )
tfd Open Success : 3
iReturn : 1
FD_ISSET(tfd, &fds)
iReturn : 1
FD_ISSET(tfd, &fds)
iReturn : 1
FD_ISSET(tfd, &fds)
crontab으로 실행했을때
tfd Open Success : 3
iReturn : 2
FD_ISSET(0, &fds)
iReturn : 2
FD_ISSET(0, &fds)
iReturn : 2
FD_ISSET(0, &fds)
도데체 머가 문제일까요..ㅠㅠ
해결했습니다.
0번 FD에 0으로 초기화하는 부분을 빼니 잘 되네요..
답변 주신분들 감사합니다.
댓글 달기