CentOS/RHELの起動スクリプト内ではsudoではなくrunuserを使う|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社エンジニアの「?」を「!」に。CONTACTTOPインフラCentOS/RHELの起動スクリプト内ではsudoではなくrunuserを使うインフラ2017.03.01CentOS/RHELの起動スクリプト内ではsudoではなくrunuserを使うmorimorihogeシェアツイートブックマークLINEmorimorihogeです。今朝は久々にAWSのus-eastリージョンが障害祭りみたいでどきどきしてます。今のところtokyoリージョンには問題なさそうですが、HerokuとかSlackみたいに内部的にus-eastに依存しているサービスは不安定のようですね。サーバ起動時の自動起動スクリプトインフラ構築をしていて忘れがちですが大事なこと、それは「再起動テスト」です。今はVPS的なクラウドサービスが主流になったので物理サーバの再起動ということはずいぶん減りましたが、それでもクラウドサービス側のメンテナンスで再起動が不定期に発生することはあります。この際、再起動時にもきちんと必要なサービスが起動するように設定しておかないと困るわけですね。LinuxではRedHat系(含むCentOS)もDebian系(含むUbuntu)も昔はsysvinitによる管理がされてきました(Ubuntuは途中upstartを使っていました)が、最近はsystemdを使う方向に統合されてきました。systemdを使っていてもサービスの起動/停止用スクリプト自体はこれまで通り使うことも可能なので、その辺りは過去の資産を流用できると思います。scripts?といった記事が参考になるかと思います。世の中はsystemdに移行しつつある中とはいえ、レガシなディストリビューションを触る機会も相変わらずあります。いうわけでinit.dなスクリプトを書いていたのですが、Ubuntuでは動いていたスクリプトがCentOS7で動かなくて困りました。具体的には、スクリプト内で書いていたsudoがrootのシェルからserviceコマンドで使う分には動作するのに、再起動時には起動しないという問題です。CentOS/RHELのデフォルト設定では起動時のsudoは許されていない(ttyがないから?)らしく、その他の方法を使う必要があります。COMMANDとすればうまいこと起動します。runuserはUbuntuにはないパッケージのため、RHEL/CentOSとUbuntuで同じスクリプトを使い回せません。COMMAND的にsudo自体をwrapすることでとりあえず許せる範囲には満足しました。systemdを使えば[Service]User=app_userするだけでディストリビューション間互換取れるんですよね。いうことに後になってから気づきました。systemdはまだ慣れてないエンジニアも多いと思うので、古いバッドノウハウを知っておくのも無駄ではないかなと思いました(願望)。まとめ久々にCentOSとか触ってハマったのでメモでした。最近社内環境はほとんどDocker化したのでsystemdよりsupervisordを使いこなせるようにならないといけないなーと思いつつ、レガシーな環境も触る機会はなくならないなあと思った日々でした。Storageを使ってはいけない(翻訳)#Tags#会社紹介#自社サービス#勉強会#Rails#PHP#デザイン#実績#週刊RailsウオッチCONTACTお気軽にご相談ください。(翻訳)CONTACTTechRachoでは、パートナーシップをご検討いただける方からのご連絡をお待ちしております。お気軽にご意見・ご相談ください。