[완료]crontab으로 실행했을때 소켓통신 오동작하는 문제입니다.(전체 소스, 전체Log 포함)

seungo의 이미지

그냥 실행했을때랑 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)

park7275의 이미지

자세히는 안보이지만..왠지 이걸것 같아서 답올려봅니다.

crontab 실행시 환경변수와 shell login 했을때 환경변수 내역이 달라서 그럴듯합니다.

이 부분을 검색해보시면 될듯..

[KILL] 죽을각오로.........

[KILL] 죽을각오로.........

seungo의 이미지

system("set")으로 출력하여 나온 PATH및 모든 경로를 똑같이 맞췄는데도 똑같은 결과가 나타납니다.
달리 확인할 내용이 있을까요?

bushi의 이미지

crontab 으로 돌릴 때도 stdin 을 사용하고 싶다는 의도의 질문이라면
그것은 불가능하다라고 대답할 수 있겠습니다.
shell 에서 직접 실행테스트 하실 때 background 로 해보시면 되겠습니다.

stdin 이 없으므로 사용할 수 없습니다.

새로 만든 fifo 가 3 으로 잡히는 것은 0,1,2 가 stdin/out/err 로 존재하기 때문이 아니라,
호환성(donkey proof?)을 위해 0,1,2 에 의미없는 파일디스크립터(/dev/null)를 미리 할당하기 때문입니다.
daemon(3) 를 참고하세요.

OTL

seungo의 이미지

stdin을 사용할려는 의도가 아니라.
일단 질문내용에서 보이듯이 바로 실행했을때랑, crontab으로 실행했을때랑 실행결과가 달라서..
그 원인을 찾고 싶은건데요.
crontab을 사용했을때 select하면 값이 없는데도 if(FD_ISSET(0, &fds)) 여기에 걸리는 이유가 궁금한건데요.
위의 로그에서 확인할수 있듯이 둘다 fd는 3으로 나옵니다.

bushi의 이미지

한국어 정말 어렵습니다.

OTL

ihavnoth의 이미지

본문과 댓글보고 추측해보면...

쉘상에서 /dev/null 오픈한 fd는

fd = open("/dev/null", O_RDONLY)
FD_ZERO(&fds);
FD_SET(fd, &fds);
 
rv = select(fd+1, &fds, NULL, NULL, &tv);
printf("%d\n", rv);

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 코드확인해보면 바로 반환해주는 루틴이 있을듯하지만
그거까지 찾아볼 의욕은 안생기겠네요...

없음

seungo의 이미지

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)

도데체 머가 문제일까요..ㅠㅠ

seungo의 이미지

0번 FD에 0으로 초기화하는 부분을 빼니 잘 되네요..
답변 주신분들 감사합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.