質問: ### 前提・実現したいこと 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 上記サイトで同様な事象で困っている人を見かけたのですが、解決策の提示までは至っていないようです。
回答: `-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`では終了できないのでしょうか?