如何向正在运行的进程中添加附加的“关闭”命令?


11

定期地,我忘了增加&& shutdown -h now一个长期运行的过程。第一个命令被调用,是否可以添加shutdown -h now命令?它无意中断正在进行的过程。也许可以观看PID?


我希望您意识到,后面的所有操作&&只有在上一个命令成功执行后才能运行。如果您希望它即使命令失败也可以运行,请;改用。
Zoke 2012年

Answers:


13

无需重复运行ps列出所有进程并通过输出进行grep。使用ctrl-Z后台运行进程,然后运行

bg %1 ; wait %1 ; shutdown -h now

如果您正在运行其他后台作业,则在按ctrl-z时将获得不同的作业规范,而不是[1]。如果是这样,请改用它。


3

您可以执行以下操作,这将检查进程是否每5秒运行一次并采取适当的措施:

while true; do
  if ps -ef | grep -q '[l]ong-running-process'; then
    sleep 5
  else
    sudo poweroff
  fi
done

请注意grep表达式中的方括号。这是为了确保该grep过程在ps列表中结束时不会被匹配。用方括号将任何单个字符括起来就足够了。


+1,因为它有效。不是我会做到的方式。
Zoke 2012年

@Zoke:如果还有其他方法,我会很感兴趣。
Scott Severance,2012年

也发布了答案。如果喜欢,请检查一下。
Zoke 2012年

您也可以使用kill -0(pid)来检查进程是否存在而不杀死它。
蓬松的2012年

3

我一直都这样做。

  1. 开始过程。
  2. 意识到我忘了做&&命令。
  3. Ctrl+ Z暂停该过程并返回到Shell。
  4. 运行fg && shutdown -h now到:
    1. 前景并恢复您刚刚暂停的过程。
    2. 然后,完成后,它将运行您想要运行的内容。

或者,您可以按照其他答案中的建议进行轮询,如下所示:

while ps -p $PID ; do sleep 5 ; done ; shutdown -h now

这将立即关闭。
psusi 2012年

fg立即完成,所以...
psusi'1

@psusi不,它不会
Wiki步行

@WalkingWiki,哦,很奇怪,您是对的。我发誓我早在2012年就对此进行了测试,并且很快就完成了。
psusi

1

如果您知道pid,则可以运行以下命令:

while ps -p $PID; sleep 5; done; shutdown -h now

要在没有ps回声的情况下运行,请执行以下操作:

while ps -p $PID >/dev/null; sleep 5; done; shutdown -h now

最后在没有任何输出的情况下在后台运行它:

(while ps -p $PID >/dev/null; sleep 5; done; shutdown -h now ) &

Scott的解决方案是一个很好的解决方案,但是grep,如果您已经知道pid,那么就无需反复进行。而且输入起来要快得多。


0

制作一个Shell脚本来运行两个进程:

MyShellScript.txt:

#!/bin/sh
MyProcessIdLikeToStart -o options && shutdown -h now

将其保存在开始给定过程的目录中后,请执行以下操作:

chmod +x MyShellScript.txt

然后,当您想运行命令时,只需键入即可./MyShellScript.txt,它会为您完成这两项工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.