私は数秒(最大10秒)待ってから、いくつかのコマンドを実行する必要があるbashスクリプトを作成しています。これは、プログラムの起動時に私には必要ない無駄なサブプロセスも起動するためです。しかし、私が言ったように、この作業を開始するのに数秒かかりますので、私がしたことは次のとおりです。
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
スリープモードになった後は、killコマンドを実行せずに手動で実行する必要があります。これはこのスクリプトのポイントから外れます。どうすればいいですか?私は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
20秒後に起きてpkill
コマンドを続行するにはどうすればよいですか?
答え1
あなたが要求する内容は明確ではありませんが、ここに問題の考えられる原因がいくつかあります。
kill
まず、過度に複雑なコマンドを削除してみましょう。これは実際の質問ではありませんが、次に切り替えると、残りの答えと最終的な解決策がより明確になります。pkill
。単一のコマンドps
で++++パイプするのと同じことを行いますgrep
。より効率的で簡単に入力できるだけでなく、結果からコマンドをフィルタリングするために正規表現のトリックは必要ありません。これは、早期のパイプ損傷を引き起こす一般的なミスであり、終了する必要があるプロセスを実行し続けることを可能にします。あなたのパターンはこれらの間違いを防ぎますが、これらの必要性を忘れるのは簡単です。あなたの質問を見ると、OS Xを使用していることがわかります。awk
kill
grep
ps
grep
する持っていますpkill
。プロセス名ではなくコマンドの引数を一致させる必要がありますが、そのためにフラグを使用できます-f
。
これが除外されると、問題の最初の考えられる原因は、初期コマンドがエラーコードで終了する可能性があることです。演算子を使用しているため、&&
最初のコマンドがゼロ終了コード(「エラーなし」を意味)を返す場合にのみ、後続のコマンドが実行されます。とにかくこのコマンドを実行するには、以下を使用する必要があります;
。
./myprogram ;
sleep 20 &&
pkill -f explorer.exe &&
pkill -f winewrapper.exe
両方のスタイルを混在させることができることに注意してください。私たちが言うのは、「無条件に実行して終了するのを待ってから、コマンドチェーンを続行するために正常に返される必要がある残りのmyprogram
エントリを実行します」です。第二段階が欲しい。とにかくステップが実行されると、2番目のステップもそのステップに切り替わります。sleep
pkill
&&
;
kill
もう1つの可能性は、次のコマンドを実行することです。しかし、Wine / CrossOverはまだ実行中ですDishonored.exe
。つまり、Wineが終了してから20秒ではなく、Wineが起動してから20秒後に終了を開始したいということです。このプログラムがバックグラウンドでフォークされない限り、後者の動作が得られます。並列動作が必要な場合は、最初のプログラムをバックグラウンドに配置する必要があります。
./myprogram &
sleep 20 &&
pkill -f explorer.exe &&
pkill -f winewrapper.exe
&
最初のコマンドを終了することは、残りの;
コマンド文字列がmyprogram
開始後すぐに実行を開始することを除いて、前の例と非常に似ています。