다음과 유사한 쉘 스크립트가 있습니다.
#!/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