在bash中当前运行的命令后如何执行命令?


18

我正在使用wget下载文件,下载完成后我想关闭计算机,但是现在我需要去某个地方:)当进程完成时,是否可以在bash exacly中执行命令?

我知道这可行:

wget http://example.com/file.rar; 现在关闭

但是,如果我只键入:

wget http://example.com/file.rar

2
考虑使用&&和|| 代替 ;。&&和|| 在执行下一条命令之前检查上一条命令的返回值...以防万一wget失败,您可能不想关闭。
KFro

Answers:


31

您可以执行以下操作:

  1. 停止使用ctrl-z执行wget(没有停止,它已挂起)
  2. 放入背景(bg)
  3. 运行:等待;立即关闭-h

wait将等待所有程序从当前shell在后台运行-即此wget。

等待完成后-关机将继续。


完成操作后,不要忘了前景(fg)您的wget实例。如果wget已经在运行,则可以使用^ z(control-z)将其置于前台。
Andrew Scagnelli 09年

4
除非您真的想查看进度栏,否则不需要。
dmckee,2009年

不需要,因为他将机器留给自己然后关闭。

11

在另一个外壳中,使用

ps -u <your username> | grep wget

找到要等待的命令的PID,然后

wait <PID>; shutdown -h now

以便在进程终止之前不会运行关机。另请参阅depesz的答案


+1,只是一张纸条:wait只会工作,从同一个shell启动的命令
Chriki

4

我的解决方案是:用Control + Z挂起您长期运行的任务,然后键入类似以下内容:

fg; echo "Done!"

如果要根据命令的成功或失败来不同地运行响应,请使用&&和||。作为短路操作员。

fg && echo "Success!" || echo "Failure!"

编辑:这不适用于sudo,因为它将要求您输入密码。因此,我已经删除了使用sudo的示例。如果第二个任务需要sudo,请使用此处发布的其他方法。

另一方面,我相信GNOME和KDE都可以通过发送适当的D-Bus信号或其他东西来提供无需使用sudo即可触发关机/重启的方法。


+1表示fg...,但是sudo如果提示您输入密码,可能会出现问题
mark4o 2009年

嗯 是的,当事情完成时,我还没有使用此技巧来洗礼。对于sudo,您需要其他技巧。我将相应地编辑我的帖子。
瑞安·汤普森

就我的目的而言,这个答案是优越的,因为它可以使流程自动回到前台
Cookie

此外,可以禁用sudo的密码(针对每个用户和每个命令)-如果允许用户通过sudo一次关闭,则可以始终允许他这样做。在某些情况下,敌对性关闭可能没有那么危险-肯定不像正在运行的计算机上受到来宾访问破坏那样危险。
Cookie 2012年

1

是的,只需键入第二个命令,然后按Enter。如果您当前的程序正在滚动文本,您将看不到您正在正确键入的内容,因此请注意按键,以确保正确执行操作。

一种更聪明的方法是切换到另一个TTY(CTRL + ALT + F1至F6)并同时运行命令,或者,如果您使用的是诸如screen之类的命令行程序,则可以在其中创建一个新窗口。


+1为第一个选项。恐怕我不明白第二种选择应该如何工作。
innaM

例如,按CTRL + ALT + F2会将您切换到新的第二个控制台,您可以在其中登录并键入命令,这样您就可以在那里运行第二个命令。其次,如果您下载屏幕(一种用于更方便地使用控制台的程序),则可以打开第二个选项卡/窗口,您可以在其中再次键入命令,而无需再次登录。但是,由于同时需要它,您可以保留选项1,我认为没有其他方法可以达到相同的效果。除非您使用另一个TTY /窗口来检查脚本,否则该进程仍在运行。:-P
塔玛拉·维斯曼

使用dmckee的答案中的wait PID
Cookie

1

如果您想了解一下,请检查wget的返回状态,只有在成功后才关闭。

% wget http://example.com/file.rar
% if [ $? -eq 0 ]
> then
> shutdown now
> fi

2
这是编写脚本时的好方法,但是在wget运行时,不会提示您构建测试。
dmckee,2009年

您可以将此与我的Control-Z和fg技巧结合使用以解决该问题。
瑞安·汤普森
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.