Bash에 다음과 같은 더미 명령이 있다고 가정합니다.
### dummy long_operation_cmd function, for easy reproduction:
function long_operation_cmd() {
echo "operation 1"
sleep 5
echo "operation 2"
}
현재 다음과 같이 bash 스크립트를 실행 중입니다.
{
long_operation_cmd
echo '===ALL DONE==='
} > /tmp/logfile.tmp &
tail -f /tmp/logfile.tmp | sed '/^===ALL DONE===$/ q' \
&& rm /tmp/logfile.tmp
이를 통해 백그라운드에서 긴 작업을 안전하게 실행하고, 출력을 추적하고, Ctrl+C가 실행을 중단하지 않도록 할 수 있습니다.
가장 중요한 점은 작업이 완료되면 sed
팔로우 모드에서 나갈 수 있다는 것입니다.
tail -f
나는 으로 바꾸고 싶었는데 less +F
, 이것이 내가 생각해낸 것입니다:
{
long_operation_cmd
echo '===ALL DONE==='
} > /tmp/logfile.tmp &
less +F -- /tmp/logfile.tmp \
&& rm /tmp/logfile.tmp
===ALL DONE===
그런데 팔로우 모드에 도달했을 때(또는 작업이 완료되었을 때) long_operation_cmd
자동으로 팔로우 모드에서 빠져 나오는 방법을 찾을 수 없습니다.
이 문제 해결에 대한 제안 사항이 있습니까?
답변1
"ALL DONE"이면 프로세스에 SIGINT 신호를 보낼 수 있습니다.
kill -int PID
하지만 이를 위해서는 PID를 알아야 합니다( less +F
백그라운드에서도 실행 중입니까?).
답변2
다른 길을 가게 될 것 같습니다.
tail -f
Ctrl-C를 먼저 캡쳐한 후 줄여 보겠습니다 . 모든 것이 순조롭게 진행되면 실행하지 않지만 "실패" less
하면 tail
(Ctrl+C의 경우) 덜 시작합니다. 원할 경우 "F"를 계속해서 사용할 수 있습니다.
최종 결과는 다음과 같습니다.
{
long_operation_cmd
echo '===ALL DONE==='
} > /tmp/logfile.tmp &
(trap : INT; tail -f /tmp/logfile.tmp | sed '/^===ALL DONE===$/ q' ) \
|| less +G /tmp/logfile.tmp && rm /tmp/logfile.tmp