2016-07-17 3 views
1

私は、他のマシンにログインしてサービスが動作していることを確認し、起動、停止、または終了するデーモンを作成しています。このため、unixコマンドは少し長くなり、難読化されます。複雑なunixコマンド内のpgrep/pkillコマンドでネガティブな先読みを作成する

APPは、リモート実行の名前で、APP_IDが起動時にアプリケーションに渡されたパラメータである
bash -c 'ssh -p 22 [email protected] pgrep -fl "APP.*APP_id=12345"' 

形成されているコマンドの基本的な形状が似ています。

リモート側で実行されている実行可能ファイルは、のようなもので開始されます。このコマンドの終了ステータスは、リモートサービスが実行されているか、正常に開始されたり殺されたかどうかを判断するために使用され

/path/to/APP configs/config.xml -v APP_id=12345 APP_port=2345 APP_priority=7 

ローカルマシンでテストするとき、sshはローカルマシンに接続して作業を簡単にしますが、この方法で呼ばれるpgrepは、サーバーが実行しているチェックコマンド。

例えば、pgrepコマンドが返すことがあります。

26308 ./APP configs/config.xml APP_id=128bb8da-9a0b-474b-a0de-528c9edfc0a5 APP_nodeType=all APP_exportPort=6500 APP_clientPriority=11 
27915 ssh -p 22 [email protected] pgrep -fl APP.*APP_id=128bb8da-9a0b-474b-a0de-528c9edfc0a5 

をだから、論理的な次のステップは、「ssh」を除外するためのpgrepパターンを変更することでしたが、のpgrepはPCREしてコンパイルされていないようですので、これは不可能だが

bash -c 'ssh -p 22 [email protected] pgrep -fl "APP.*APP_id=12345" \\| grep -v ssh' 
:回避策として、私はgrepのを使用していたので、

bash -c -'ssh -p 22 [email protected] preg -fl "\(?!ssh\).*APP.*APP_id=12345" 

これは正規表現のエラーがスローされます。たとえば、先読みを可能バージョン

これは回避策ですが、これはpgrepを使用してクエリを実行する場合に効果的です。 grepのが効果的であるためには何の機会がありませんので、しかし、pkillはを使用して次のステップでは動作しません:pkillコマンドも終了ステータスが悪いことになりssh接続を殺すため

bash -c 'ssh -p 22 [email protected] pkill -f "APP.*APP_id=12345"' 

はうまく動作しません。だから、私は自分のpgrep/pkillパターンを変更し、多くの運を持たないことに戻ります。

この環境には、(この場合には、APPは、「時計」になります)パスワードなし自体へのSSHことができ、ローカルマシン上の単純なものでシミュレートすることができます:ここで

watch echo APP_id=12345 

は、簡単に言えば質問です:pgrepで 'APP'とはどのように 'ssh user @ host APP'とマッチしませんか?

+0

必要なパターンをよりよく理解するためにプロセスリストを含めると便利です。 –

+0

[systemd user instance](https://wiki.archlinux.org/index)を使用するとよいでしょう。php/Systemd/User)を使用して、* systemd *があなたのサービスを管理できるようにします。 –

+0

@JürgenHötzelリモートマシンはクラウドインスタンスです...私はsystemdのために書いているサービスをインストールすることは可能ですが、それはかなりの質問ではありません...私はいくつかの正規表現の構文がないかと思います。私は気づいていません。 –

答えて

1

それは、回避策のようなものだが、仕事をしていません:唯一のアプリケーション名の前にスペースを持たないコマンドが一致し

bash -c 'ssh -p 22 [email protected] pgrep -fl "^[^\s]*APP.*APP_id=12345"' 

...。これは完全には完了していません。実行可能ファイルへのパスに空白を含むディレクトリが含まれている可能性がありますが、これを行う別の方法は考えていません。

関連する問題