打印到使用 nohup 命令生成的日志文件中的特定行

问题描述 投票:0回答:1

我正在运行以下命令:

nohup myscript.sh &> file.log &

这个过程需要很长时间才能完成。 nohup 将收集输出和错误并将其写入上面的 file.log 中。

myscript.sh 将在后台进程中激活脚本,如下所示:

# myscript.sh starts here
#!/bin/bash

status_bar(){
printf "["
While kill -0 "$1" 2>/dev/null; do
    printf "-"
    sleep 1
done
printf "] done!"
}

pid=()
for i "${array[@]}"; do
     echo starting process for "$i"
     script_A.sh "$i" &
     status_bar $!   # I need to print this funtion output in the terminal while running with nohup command
     pid="$!"
done


for id in ${pid[*]}; do
    wait $id
done

echo print its done

我需要将 myscript.sh 和/或 script_A.sh 中的一些行写入日志文件以及打印在控制台上。我尝试了以下链接中的不同方法,但似乎没有任何效果。我该怎么做?

将 stdout 的 COPY 重定向到 bash 脚本本身的日志文件

如何在脚本本身内重定向整个 shell 脚本的输出?

在 bash 中重定向到标准输出

使用 nohup -> 输出到文件和控制台

nohup myscript.sh &> file.log | tail -f file.log & 

上面的命令有效,但它会打印所有行并完全填充终端。

我只需要将 myscript.sh 和/或 script_A.sh 中的特定行打印在控制台上,这样用户就不需要总是打开日志文件来了解状态。 (目前,status_bar $! 输出在 nohup 日志文件中打印,但不在终端中打印。我需要在使用 nohup 命令运行时在终端中打印此功能 status_bar $! 输出)。提前致谢。

bash shell stdout io-redirection nohup
1个回答
0
投票

这是一种完全可定制的方法,适用于正在运行的每个作业。

建议改编你的剧本

#!/bin/bash

pid=""
for i in "${array[@]}"; do
     echo starting process for "$i"
     script_A.sh "$i" &
     pid="$!"

     ### ActionForProcess_${i} must know names of specific output files
     ###    from "script_A.sh ${i}" to parse for meaningful messages. 
     nohup ( wait ${pid} ; "actionForProcess_${i}" ) &
done

echo print its done
© www.soinside.com 2019 - 2024. All rights reserved.