쉘 스크립트에서 백그라운드 프로세스를 시작하고 프로세스의 출력을 기록하는 방법은 무엇입니까?

쉘 스크립트에서 백그라운드 프로세스를 시작하고 프로세스의 출력을 기록하는 방법은 무엇입니까?

다음과 유사한 쉘 스크립트가 있습니다.

#!/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

관련 정보