我有这行代码:
{ 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。
答案 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
,并传递选项以附加到输出文件。然后,对要复制的文件的名称使用pgrep
(cp
将获得太多匹配):
/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而不是time
或sleep
。