![쉘 스크립트에서 백그라운드 프로세스를 시작하고 프로세스의 출력을 기록하는 방법은 무엇입니까?](https://linux55.com/image/87489/%EC%89%98%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90%EC%84%9C%20%EB%B0%B1%EA%B7%B8%EB%9D%BC%EC%9A%B4%EB%93%9C%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EB%A5%BC%20%EC%8B%9C%EC%9E%91%ED%95%98%EA%B3%A0%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%9D%98%20%EC%B6%9C%EB%A0%A5%EC%9D%84%20%EA%B8%B0%EB%A1%9D%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
다음과 유사한 쉘 스크립트가 있습니다.
#!/bin/bash
# Here is where I set a bunch of environment variables that are
# used by the process invoked below...
# Now I want to invoke the process in the background and redirect
# all of the output to a log file.
nohup name-of-executable > logfile.out 2>&1 &
# Finally, I record the PID of the process before the script exits.
echo $! > proc.pid
사용 사례는 누군가 주기적으로 이 시스템에 SSH로 접속하여 이 프로세스를 시작한 다음 시스템에서 로그오프하는 것입니다. 프로세스 실행 중에 발생하는 모든 문제를 디버깅할 수 있도록 로그 파일을 생성하면 됩니다.
위 스크립트를 사용하면 프로세스가 올바르게 실행되고 로그 파일이 생성되지만 로그 파일에 출력이 기록되지 않습니다. 방금 길이가 0인 파일을 받았습니다.
nohup name-of-executable > logfile.out 2>&1 &
명령줄에서 직접 명령을 실행 하면 프로세스가 예상대로 실행되고 데이터가 기록됩니다. 쉘 스크립트의 일부로 이것을 실행하는 방법을 모르겠습니다.
답변1
nohup 대신 screen을 사용하는 것은 어떻습니까? 이렇게 백그라운드 처리를 할 수 있습니다
screen -d -m /bin/bash 'name-of-executable > logfile.out 2>&1'
nohup
이것은 백그라운드 작업에 무슨 일이 일어나고 있는지에 대한 아이디어를 제공하기 때문에 실제보다 낫습니다 . 명령을 실행 screen -ls
하여 모든 작업 목록을 확인하고 screen -r screen_identifier
해당 백그라운드 작업에 대한 대화형 셸로 직접 이동할 수 있습니다. 자세한 내용을 보려면 입력하세요 man screen
.
답변2
의견 내용을 바탕으로 원하는 결과를 얻을 수 있습니다.
#!/bin/sh
nohup sh -c "sleep 5 && ls /proc/1/fd /proc/$$ >/tmp/log 2>/tmp/log.err" &
echo $$ >>/tmp/pid_log
wait
echo done
출력은 다음과 같습니다.
$ grep . /tmp/log{,.err}
/tmp/log:uid_map
/tmp/log:wchan
/tmp/log.err:ls: cannot open directory /proc/1/fd: Permission denied