我正在制作一个 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}'`"
我该怎么做才能唤醒sleep
并pkill
在 20 秒后继续执行命令?
答案1
目前尚不清楚您在问什么,但我在这里看到了几个可能的问题根源。
让我们kill
先把过于复杂的命令排除掉。这不是实际的问题,但如果您切换到,它将使答案的其余部分以及您的最终解决方案更加清晰pkill
。它与单个命令中的ps
+ grep
+ awk
+管道执行相同的操作。kill
它不仅更高效、更容易输入,而且不需要任何正则表达式技巧来grep
从ps
结果中过滤命令,这是一个常见的错误,会导致管道过早损坏,从而使本应被终止的进程继续运行。您的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
启动后立即开始运行。