Linux 延迟命令直到旧进程完成

Linux 延迟命令直到旧进程完成

我希望现在能够启动一个命令,但只能在旧命令(已在运行)完成后才能启动它。

例如,假设我正在通过网络复制一个大文件,这个操作已经占用了我的网络带宽。然后我想将第二个大文件(不太重要)复制到同一目标,但为了让第一个文件尽快完成,我想将第二个文件延迟到第一个文件完成后再进行复制。

通常我会这样做:

10分钟前:
cp large_file_urgent ~/networkmnt/
现在时间:
sleep <some_guesstimated_time_for_old_cp_to_finish> && cp large_file_lessimportant ~/networkmnt

有没有更聪明的方法可以做到这一点?我能以某种方式告诉第二个cp等待直到第一个cp的PID终止吗?

这是在 Ubuntu 13.04 上(如果有任何后果的话)。

答案1

如果你事先知道需要运行的命令,那么你可以直接执行

cp file1 file2; cp file3 file4

如果你已经启动了第一个命令,并且你在同一个 shell 中,你可以按Ctrl+ Z,然后bg将第一个命令置于后台,然后调用wait等待作业编号或 PID 完成。例如:

$ sleep 30
^Z
[1]+  Stopped                 sleep 30
$ bg
[1]+ sleep 30 &
$ wait %1; echo "next command"
[1]+  Done                    sleep 30
next command

答案2

cp largefile1 somedestination

...时间流逝...

wait $(pidof cp)
cp largefile2 someplace

bash 内置等待将暂停,直到指定的作业/进程(如果未指定,则为所有作业)完成后再继续。

答案3

您可以使用文件系统检查该进程是否仍在运行/proc

while test -d /proc/$cp_pid; do
  sleep 10
done 
cp next_big_file network

相关内容