获取定时过程的PID以及时间输出

时间:2017-05-29 18:55:48

标签: bash scripting pid

我有这行代码:

{ time cp $PWD/my_file $PWD/new_file ; } 2> my_log.log

我需要知道执行' cp'需要多长时间?命令,我还需要获得' cp'的PID。我只想打印“cp'”的PID。处理并在my_log.log文件中获取以下内容:

<output of time> 

我尝试了PID=$!,但这不提供cp进程的PID。

5 个答案:

答案 0 :(得分:2)

要了解cp命令需要多长时间才能检查新文件大小

using System;

public class Program
{
   public static void Main()
   {
      Example<string> test = new Example<string>(value1: "test");
      test.Print();//Prints test1
   }

class Example<T>
{
    private object Value;

    public Example(T value1)
    {
       this.Value = value1 + "1";
    }

    public Example(string value2)
    {
        this.Value = value2 + "2";
    }

    public void Print()
    {
          Console.WriteLine(Value as string);
       }
    }   
}

编辑:以下评论size=$(stat -c %s "${old_file}") cp "${old_file}" "${new_file}" & cp_pid=$! while kill -0 ${cp_pid}; do cpsize=$(stat -c %s "${new_file}") echo elapsed time $(ps -p${cp_pid} -oetime=) echo $((100*cpsize/size)) % done so far.. sleep 3 done 可以被stat -c %s "${file}"替换为POSIX和更合适的命令(参见手册页)。

答案 1 :(得分:2)

  • 首先,您需要将(定时的)cp命令发送到后台并使用尾随&,以便在启动后检查正在运行的进程。 (我怀疑你已经这样做了,但目前还没有反映在这个问题中)。

  • $!,包含最近启动的后台作业的PID的特殊变量,在这种情况下反映了运行time命令的子shell ,所以我们知道它是cp命令的进程。获得(在这种情况下是唯一的)子进程:

    • 如果您的平台具有非标准pgrep实用程序(随许多Linux发行版和BSD / macOS平台一起提供),请使用:
      pgrep -P $!

    • 否则,请使用以下符合POSIX标准的方法:
      ps -o pid=,ppid= | awk -v ppid=$! '$2 == ppid { print $1 }'

为了方便起见,使用prgep将所有内容放在一起:

# Send the timed `cp` command to the background with a trailing `&`
{ time cp "$PWD/my_file" "$PWD/new_file"; } 2> my_log.log &

# Get the `cp` comand's PID via its parent PID, $!
cpPid=$(pgrep -P $!)

答案 2 :(得分:0)

我能想到的最简单的是

width="560" height="315"

答案 3 :(得分:0)

好的 - 从评论:“my_log.log的内容将是cp命令的PID,后跟cp命令的定时输出”:

( time cp $PWD/my_file $PWD/new_file & 2>&1; echo $! ) > my_log.log 2>&1 

首先,您需要显式使用/usr/bin/time,并传递选项以附加到输出文件。然后,对要复制的文件的名称使用pgrepcp将获得太多匹配):

/usr/bin/time --output=my_log.log --append cp $PWD/my_file $PWD/new_file &  pgrep -f my_file > my_log.log

您可能想要更改输出格式,因为它有点难看:

18400
0.00user 0.30system 0:02.43elapsed 12%CPU (0avgtext+0avgdata 2520maxresident)k
0inputs+496424outputs (0major+141minor)pagefaults 0swaps

答案 4 :(得分:0)

根据您在上述评论中所写的内容......以下是正确答案:

以下代码(仅举例):

time (sleep 10 & echo -n "$!"; wait)

会返回类似的内容:

30406
real    0m10.009s
user    0m0.004s
sys 0m0.005s

在你的情况下:

time (cp $PWD/old_file $PWD/new_file & echo -n "$!"; wait) &>  my_log.log

将完成这项工作。

我发现这个解决方案非常优雅,因为它是一个“单线程”,尽管你在时间上得到了“完全可以忽略不计的开销”(时间将与整个子shell相关(也是echo和{{ 1}})。从睡眠命令的结果可以看出开销可以忽略不计。

wait将stdout和stderr重定向到同一个文件(因此您无需指定&>)。

注意做

1>&2

在您的情况下,您将获得(time sleep 10 & echo -n "$!") 流程的pid而不是timesleep