質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • Linux

    4506questions

    Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

  • bash

    815questions

    bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

  • SSH

    696questions

    SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

  • sh

    346questions

    shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

  • Jenkins

    175questions

    Jenkinsとは、Apache TomcatなどのServletで動作しているサーバーベースシステムです。Jenkinsはオープンソースであり、LInux,Mac OS X,Windows,Solaris,FreeBSDとOpenBSDのためのパッケージがあります。

Jenkinsのshellタスクでpkillが失敗し、ジョブが途中終了となる

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 634

wi2yuki

score 9

 前提・実現したいこと

Jenkinsにて、CI/CDを実装しております。

1) GITからソースを取得して、ビルド
2) 1)で生成したjarファイルを検証サーバにコピー
3) 既存jarプロセスをKILL
4) jarを再起動


という手順で行っております。
上記手順の3)で「pkill」にて既存jarプロセスをkillしようとしておりますが、
jenkinsジョブが失敗してしまいます、、、
コンソールから実行するとうまくいくのですが、、、

 発生している問題・エラーメッセージ

「前提・実現したいこと」に記載してある手順の

3) 既存jarプロセスをKILL


にてうまくいかず困っております。

 pkill -SIGKILL -f hoge-.\*\\.j\ar || true


上記のように、コマンドを組んでおり、pkillコマンドが失敗しても、後続のtrueで成功するように
しているのですが、trueまで来ないで、jenkinsジョブが失敗して終了してしまします。
お聞きしたいことは下記2点です。
・pkillが失敗だったとしても、後続のタスクは実行したいのですが、方法はございますでしょうか?
・pkillによって、対象プロセスがkillできているのに、jenkinsジョブが失敗となるのはなぜでしょうか?

 該当のソースコード

手順の2)3)に該当するshellソースです。

target_path=/tmp/hoge-${API_VERSION}.jar
ssh -t -t user1@xx.xx.xx.xx "expect -c '
  set timeout 60
  spawn sudo su -c \"cp -f $target_path /home/user1; pkill -SIGKILL -f hoge-.\\\\*\\\\\\\\.j\\\\ar || true\"
  expect \":\"
  send \"abcdef\n\"
  expect \" \"
  wait
'"

 参考になりそうなサイト

stack over flow
上記サイトで同様な事象で困っている人を見かけたのですが、解決策の提示までは至っていないようです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

-fオプションを使っているために、su -c "~~~"プロセスがパターンにマッチしてキルされてしまうからですね。

spawn sudo su -c \"cp -f $target_path /home/user1; pkill -SIGKILL -f h[o]ge-.\\\\*\\\\\\\\.j\\\\ar || true\"


のようにして、su -cがパターンにマッチしないようにすればいいと思います。
(パターン文字のどれかを[ ]で囲む)

あと、SIGKILLしてますが、デフォルトのSIGTERMでは終了できないのでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/03 13:34

    ご回答ありがとうございますmm
    言われてみるとそうですね、、、
    試してみます!!!!

    キャンセル

  • 2018/09/06 12:58

    []で囲うことはできませんでしたが、pkillでkillするプロセスを一意になるようにしたら、うまくいきました!!!
    ありがとうございました!

    キャンセル

0

別な方が回答してますが、正規表現はかぶると面倒なことになった記憶があるので誤爆するようなら
grep -vで消してく方法もあります

ps aux | grep hoge.jar | grep -v grep |grep -v grep | awk '{print \$2}'|xargs kill -9

以下修正前

cp -f $target_path /home/user1;

これコピー先間違ってないですか?

うろ覚えで実機無いので確かめてませんが、 「;」の場合Jenkinsはこの行でエラーが発生したので終了するという挙動した記憶があります。

ですのでパスを正しくするか以下の用に;で終わる場合も終了ステータスのハンドリングをすると動くと思います。

cp -f $target_path /home/user1 || true;

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/03 12:51

    回答ありがとうございます。
    コピー先は間違っていないように思われます。
    pkillのセンテンスをなくし、cpコマンドだけにすると成功するのです、、、
    なので、やはり問題はpkillかと思われるのです、、、

    キャンセル

  • 2018/09/03 13:58

    pathがjarをディレクトリに上書きしてるように見えたのですが、間違ってないようであれば結構です。
    どうやらsshリモートコマンドで実行すると、「f」Optionによって同じOption名を持つ親bashがkillされてしまうようです。
    https://unix.stackexchange.com/questions/406763/oring-with-true-in-a-command-over-ssh

    試しにpgrep -fl で何がpkillに補足されているか確認して見てみてください。
    おそらく2つpidが表示されるはずです。

    自前でpkill+bashを除外すると動くと思います。サンプルコードは回答に乗せときます。

    キャンセル

  • 2018/09/06 13:13

    ありがとうございますmm
    大変参考になりました!!

    キャンセル

同じタグがついた質問を見る

  • Linux

    4506questions

    Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

  • bash

    815questions

    bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

  • SSH

    696questions

    SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

  • sh

    346questions

    shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

  • Jenkins

    175questions

    Jenkinsとは、Apache TomcatなどのServletで動作しているサーバーベースシステムです。Jenkinsはオープンソースであり、LInux,Mac OS X,Windows,Solaris,FreeBSDとOpenBSDのためのパッケージがあります。