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

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

新規登録して質問してみよう
ただいま回答率
85.48%
bash

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

Jenkins

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

SSH

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

Linux

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

sh

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

Q&A

解決済

2回答

1262閲覧

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

wi2yuki

総合スコア19

bash

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

Jenkins

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

SSH

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

Linux

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

sh

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

0グッド

0クリップ

投稿2018/09/03 03:04

編集2018/09/03 03:54

前提・実現したいこと

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ソースです。

shell

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

参考になりそうなサイト

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

Bash

1spawn 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 04:28

otn

総合スコア84499

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wi2yuki

2018/09/03 04:34

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

2018/09/06 03:58

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

0

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

bash

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

以下修正前

bash

1cp -f $target_path /home/user1;

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

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

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

bash

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

投稿2018/09/03 03:41

編集2018/09/03 05:02
namda

総合スコア705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wi2yuki

2018/09/03 03:51

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

2018/09/03 04: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を除外すると動くと思います。サンプルコードは回答に乗せときます。
wi2yuki

2018/09/06 04:13

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問