在另一个(已经运行)完成之后启动脚本

skd*_*skd 57 linux bash process

所以我有一个进程在运行,需要几个小时才能完成.我希望自动完成另一个过程.请注意,我无法在第一个脚本中添加对第二个脚本的调用,也不会创建另一个顺序运行它们的脚本.在Linux中有什么办法吗?

编辑:一个选项是x使用pgrep 每分钟轮询并检查过程是否完成.如果是,请启动另一个.但是,我不喜欢这个解决方案.

PS:两者都是bash脚本,如果有帮助的话.

thi*_*ton 59

给定第一个进程的PID,循环

while ps -p $PID; do sleep 1; done ; script2
Run Code Online (Sandbox Code Playgroud)

应该做的伎俩.这比pgrep和进程名称稍微稳定一些.

  • 我会修改这个,不要淹没终端:`echo Waiting ...; 而ps -p $ PID>/dev/null; 做睡觉1; 完成; script2` (14认同)

小智 34

也许你可以先按ctrl + z然后输入

fg; echo "first job finished"
Run Code Online (Sandbox Code Playgroud)

  • 一种实用(可能非常广泛使用)的方法. (6认同)
  • @ScheissSchiesser```分离命令,无论它们是什么.所以在这种情况下,`fg`将挂起的作业带到前台,并完成它; 然后运行第二个命令.就像你提到的那样,你也可以做`fg && mysecondjob`,只有当第一个(恢复的)作业返回0退出代码(即成功完成)时才会启动第二个作业. (3认同)

Sor*_*gal 29

轮询可能是要走的路,但它不一定非常可怕.

pid=$(ps -opid= -C your_script_name)
while [ -d /proc/$pid ] ; do
    sleep 1
done && ./your_other_script
Run Code Online (Sandbox Code Playgroud)

  • 我不同意.轮询几乎是永远的方式.通过轮询,总会讨论等待循环的延迟:一秒钟?十分之一秒?对于某些用例,您的选择可能是正常的,但对于其他用例而言则不是最佳选择.但是,UNIX/bash提供了这样做的方法_right_:`wait`.`wait`暂停你的工作,直到另一个流程结束,然后你的工作将立即恢复.没有任意延迟.Subito.无需循环._Except_如果您要等待的作业未在同一个shell中启动. (3认同)
  • 我接受了这个答案,因为这是我最终做的事情.但是,我同意等待可能总是要走的路.这似乎仍然是一个受欢迎的问题,所以如果有人来这里寻找答案,只需使用等待@hagello和更多建议. (2认同)

ks1*_*322 21

wait已经可以使用bash内置命令运行进程wait.男人打击.

wait [n ...]等待每个指定的进程并返回其终止状态.每个n可以是进程ID或作业规范; 如果给出了作业规范,则等待该作业管道中的所有进程.如果未给出n,则等待所有当前活动的子进程,并且返回状态为零.如果n指定不存在的进程或作业,则返回状态为127.否则,返回状态是最后一个进程或作业等待的退出状态.

  • 我只是想指出`wait'只适用于同一个shell的子进程. (11认同)