sleep 命令没有做它应该做的事情?

sleep 命令没有做它应该做的事情?

我正在制作一个 bash 脚本,我必须等待几秒钟(最多 10 秒钟),然后运行一些命令。这是因为当程序启动时,它还会启动一些我不需要的无用子进程。但正如我所说,这些启动需要几秒钟,所以我所做的是:

here is where the program is started && sleep 20 && kill `ps -x | grep explorer.ex[e] | awk '{print $1}'` && kill `ps -x | grep winewrapper.ex[e] | awk '{print $1}'`

但是在sleep它进入睡眠状态之后,它不会运行终止命令,而是我必须手动运行它们,这远离了这个脚本的意义。我应该做些什么?是我使用sleep命令错误吗?

编辑:由于要求关闭这个问题,我想我会澄清一下。

进程sleep不会唤醒,pkill命令也不会运行。这是我的整个脚本(它是 AppleScript,但我正在从 AppleScript 运行 unix 脚本):

do shell script "killall applet && cd /Applications/Dishonored.app/Contents/Resources/Dishonored/Binaries/Win32 && /Applications/CrossOver.app/Contents/SharedSupport/CrossOver/bin/wine --bottle ny\\ flaska\\ 2 Dishonored.exe && sleep 20 && kill `ps -x | grep explorer.ex[e] | awk '{print $1}'` && kill `ps -x | grep winewrapper.ex[e] | awk '{print $1}'`"

我该怎么做才能唤醒sleeppkill在 20 秒后继续执行命令?

答案1

目前尚不清楚您在问什么,但我在这里看到了几个可能的问题根源。

让我们kill先把过于复杂的命令排除掉。这不是实际的问题,但如果您切换到,它将使答案的其余部分以及您的最终解决方案更加清晰pkill。它与单个命令中的ps+ grep+ awk+管道执行相同的操作。kill它不仅更高效、更容易输入,而且不需要任何正则表达式技巧来grepps结果中过滤命令,这是一个常见的错误,会导致管道过早损坏,从而使本应被终止的进程继续运行。您的grep模式避免了这个错误,但很容易忘记这一需要。我从你的问题看出你使用的是 OS X,所以你pkill。您需要匹配命令的参数而不是进程名称,但您可以使用标志来做到这一点-f

排除这种情况后,问题的第一个可能根源是您的初始命令可能会退出并显示错误代码。由于您使用的是&&运算符,因此仅当第一个命令返回 0 退出代码(表示“无错误”)时,才会运行后续命令。如果您希望这些命令无论如何运行,您需要使用;

./myprogram ;
      sleep 20 &&
      pkill -f explorer.exe &&
      pkill -f winewrapper.exe

请注意,可以混合两种样式。我们说的是,“myprogram无条件运行,等待它退出,然后运行其余的事情,所有这些都必须成功返回才能继续执行命令链。”sleep永远不会失败,但如果第一步pkill可能会失败并且您希望第二步无论如何都运行,请将第二步也切换&&;

另一种可能性是您希望kill运行这些命令尽管Wine/CrossOver 仍在运行Dishonored.exe。也就是说,您希望在 Wine 启动后 20 秒开始杀戮,而不是在其退出后 20 秒。除非这个程序将自己分叉到后台,否则您将得到后一种行为。如果您想要并行行为,您需要将第一个程序置于后台:

./myprogram &
      sleep 20 &&
      pkill -f explorer.exe &&
      pkill -f winewrapper.exe

终止&第一个命令;与前面的示例非常相似,只是命令字符串的其余部分在myprogram启动后立即开始运行。

相关内容