프로그램을 백그라운드로 실행을 시키는데 문제가 좀....

miso의 이미지

제가 만든 서버를 백그라운드로 실행을 시키려고
nohup 실행파일 &
하면 백그라운드로 실행은 되는 데요...
nohup.out 이라는 파일이 안생겨요....
이전에 제가 자바로 서버를 만들어서... 리눅스에서 백그라운드로..
nohup java Server.class &
하면.. nohup.out 파일이 자동으로 생겨서.... 제가 프로그램 안에서..
에러가 발생하면 System.out.println으로 찍게한 내용이 nohup.out 파일에 찍혔거든요...
그런데...
이번에 C로 짠 서버에서는
nohup ./Server &
하면 백그라운드로 실행은 되는데 nohup.out 은 안생기고 제가 찍게한 에러 메세지 즉 printf으로 찍게한 메제지기 그냥 화면에 찍혀요...
그리고 시스템을 나갔다가 들어오면... 화면에 찍던 에레 메시지는 아예 찍디고 안아요...
프로그램은 돌아 가는데...
무엇이 문제 인가요...
백그라운드로 실행 시키고 printf로 찍게 한 메세지는 nohup.out 파일이나 다른 파일에 찍게 할 수 없나요..
프로그램 안에서 파일을 열어서 찍는 방법 말고요..
위에서 말씀드린.. java를 실행 실킬때 처럼 자동으로 nohup.out 파일이 생겨서 에러 메세지를 nohup.out 파일에 찍게 할 수 있는 방법은 없나요?

june8th의 이미지

./exe_cmd > xxx.log & 하세요

miso의 이미지

님께서 알려 주신데로...
./Server > log.out &
했는데요...
log.out 파일은 생기는데...
프로그램안에서.. printf로 찍는 메세지가... log.out 파일에 안찍히고..
바로 화면에 찍혀요...
그리고 빠져 나왔다가 들어가면.. 화면에 찍히던 메세지마져...
안찍힙니다..
이를 어찌하여야 하나요.. ㅡㅡ;;;
다른 해결 방법은 없나요?

*^^*

카레의 이미지

저기 아랫부분의 command 부분을 바꿔 주시면 사용가능합니다.
:oops:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>

int main(int argc, char *argv[])
{
    int fd_stdout = 1;
    int fd_stderr = 2;
    int fd_save_stdout, fd_save_stderr;
    int fd_outfile, fd_new_outfile, fd_new_errfile;
    int ret;
    char * command = argv[1];
    char * outfile = argv[2];

    // open file and backup desc
    FILE *fp;
    if ((fp = fopen(outfile, "w")) == 0 )
    {
        printf("can't open %s\n", outfile);
        return -1;
    }
    fd_outfile = fileno(fp);
    fd_save_stdout = dup(fd_stdout);
    fd_save_stderr = dup(fd_stderr);
    printf("before redirection\n");
    fflush(stdout);

    // redirect stdout to file
    dup2(fd_outfile, fd_stdout);
    dup2(fd_outfile, fd_stderr);
    close(fd_outfile);

    printf("after redirection\n");
    ret = system(command);
    fflush(stdout);


    // restore stdout
    dup2(fd_save_stdout, fd_stdout);
    dup2(fd_save_stderr, fd_stderr);
    close(fd_save_stdout);
    close(fd_save_stderr);

    printf("this string must be printed on screen\n");
        
}

아싸~

miso의 이미지

제가 원하는 것은요. 자바 서버 프로그램을 구동 시켰던 것처럼...
자동으로 log.out 파일에 쓰게 하는 방법을 물어 본 것인데요...
님께서 알려 주신 방법은 네가 log.out 파일을 소스 코드 상에서...
열고... 그리고 log.out 파일에 에러 메세지를 쓰고.. 그다음에 닫아 줘야하는 방법이잖아요...
자바를 실행했을때 처럼.... 자동으로 log.out 파일이 생기고 그리고 나서..
자동으로 log.out 파일에 쓰게할 수 없나요?....
꼭 소스 코드 안에서 일일이 코딩을 해줘야하나요?
아님 다른 방법이 있으면 좀 알려 주세요?

*^^*

see2002의 이미지

출력을 printf(); 대신에, fprintf(stdout, ...); 를 쓰면 될겁니다.
그렇게 하니까 되더군요. :)

miso의 이미지

님께서 알려주신 방법으로 printf 로찍는 메세지를 fprintf(stdout, .....) 이 함수로 전부 바꾸어서 컴파일하고 서버 프로그램을 돌려 보았는데....
그 전 상황과 똑같은데요.... ㅡㅡ;;;
하실때 특별히 다르게 지정해 주신거라도 있는지....
하루 빨리 해결을 해야하는데....
한고비 넘어가면 다른 고비가 기다리고 있으니...
코딩의 세계는 너무 험난한 것 같습니다...

*^^*

see2002의 이미지

fprintf(stdout, ...);
으로 바꾸고 아래처럼 실행하면....
./실행파일 > xxx.log
xxx.log 파일이 쌓일거예요.... 그래도 안되면....쿨럭.... ㅡ,.ㅡ;;;;

impactbar의 이미지

에러메시지는 2> 를 사용해야 합니다.

./a.out 2> nohup.out &

miso의 이미지

see2000님과 impactbar 님께서 알려주신 방법으로 해봐도 안됩니다...
이를 어쩌나.... ㅜ.ㅜ

*^^*

unixguy의 이미지

1. 제가 리눅스로 확인한 거는 아니고 POSIX 맨페이지에 따르면 nohup 은 반드시 nohup.out 화일을 현재 디렉토리밑에 이게안되면 HOME 환경변수 디렉토리 밑에 만들게 되어 있군요. 이 두 군데중 아무데도 nohup.out 화일을 못 만들면 해당 프로그램을 아예 실행시키지 말아야 된다고도 써 있구요. 사용하시는 nohup 이 이규칙을 따르고 있다는 가정하에서 $HOME 디렉토리 밑에 화일이 생겼나를 확인해 보시죠. 아마 생겼더라도 말씀하시는 증상으로 보면 내용은 비어 있겠지만요.

2. 소스에서 stdout (fd==1) 을 닫고나서 이를 다시 /dev/tty 같은데로 옮기지는 않았는지 확인 해 보시죠. 그게 가능성이 좀 있을 것 같은 데요. 아니면 메인에서 첫번째 printf 까지만이라도 소스를 좀 올려놔 보세요.

즐거운 하루되시기를

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.