2012-01-10 13 views
0

何らかの理由で中断されているプロセスをシミュレートするスクリプトを作成したいと思います。bash - 前のコマンドの前に後のコマンドを実行するには?

だから私はプロセスにこのような 何か殺す何かを実行しよう:sshコマンドがあるため、「-f」のバックグラウンドで実行され、キルコマンドはならないことを願って

ssh -f localhost sleep 7;kill pid 
call_function_from_another_script_that_runs_the_process 

をすぐに睡眠のために実行されます。 問題は、ここでスリープが有効にならないということです。殺害はすぐに実行されています。

-fを付けずにsshを実行すると、2行目は呼び出されず、プロセスは実行されません。

2番目の行は、それがそうであると仮定してください - プロセスを実行する別のスクリプトから関数を実行してください。私は "スクリプトにその関数を入れて実行する"、またはすでに書かれた他のものを変更することはできません。

ありがとうございました。

+0

プロセスが実行される前のIDをどのように知っていますか? – Johnsyweb

+0

実際には "pid"ではありません。 IDを名前で検索するpsコマンドです。 – AAaa

+0

実行する前に? – Johnsyweb

答えて

7

sshを使用してバックグラウンドで何かを実行する必要はありません。これを使用します。

(
    sleep 7 
    kill pid 
) & 
call_function_from_another_script_that_runs_the_process 

は、バックグラウンドで全体サブシェルを置く「&」を注目してください。サブシェルの内部では、最初にsleepが実行され、次にkillが実行されます。

ちなみに、スクリプトの行が2つのコマンドを持っているので、あなたの例ではkillコマンドはすぐに有効になります理由:「kill pidを」「ssh -f localhost sleep 7を」とのSSHセッション内ではなく、一つのコマンドを(「sleep 7;kill pid」) 。

+0

両方の洞察に感謝します! – AAaa

+0

これは素晴らしいですが、PIDをどのように知っていますか? – Johnsyweb

1

次のようにsshコマンドを引用してください。引用符を付けないと、セミコロンはsshコマンドの終わりを示します。したがって、2番目のkillコマンドは、sshコマンドがバックグラウンドに置かれた直後に実行されます。

ssh -f localhost "sleep 7;kill pid" 
call_function_from_another_script_that_runs_the_process 
+0

'ssh localhost' *は本当に必要ですか? – Johnsyweb

+0

いいえ、そうではありません。私はOPのコマンドに何が間違っているのか、どうやって修正できるのかを説明するだけで、まったく新しい選択肢を示唆するものではありません。 – dogbane

1

バックグラウンドでプロセスを実行するために&を使用してください。

some_long_running_process & 
pid=$! 
sleep 7 
kill ${pid} 

完了。

関連する問題