incronで起動したプロセスがdefunct(ゾンビ)で残る障害対策

CentOS 7上で2018年12月頃にincronでバグが発生した。

psコマンドを叩いてみると、「defunct」で示されるゾンビプロセスが大量に発生している!

当然のことながら放置すればシステムは暴走しかねない状況にある。
さて、どうしたものか?と思いながら、ゾンビプロセスを殺そうと試みるもkillコマンドでプロセスを殺すことが出来ない。
何故だろう?とその親プロセスを見てみると「incron」が親になっている。

そうこうしている間にもゾンビは増え続けているではないか!?

incronを殺す・・・と言ってkillする必要はないので、以下のコマンドを実行してincronを再起動させてみる

ここでプロセスを確認してみる。

発生していた「defunct」は一掃されゾンビプロセスは綺麗にその姿を消していた。

原因はどうやら「incrond」にあるらしいことまでは、これで特定出来たのだがどうにかならないかと思いながらインターネットを検索するもそれらしき情報がヒットしない。。。しばらくして辿り着いたのが以下のRedHat Bugzillaだった。

https://bugzilla.redhat.com/show_bug.cgi?id=1656939

どうやらincrondのバグが確認されているらしい。
対処方法は、古いソースを入手してリコンパイル&インストールすることになる様だ。当然、現在のincrondを削除しなければならない・・・ということは、設定をメモして云々・・・・(嫌だ!)

そうこうしている間にも、defunctは増え続けていた。
以下のコマンドを実行すると、その数が解る。

出力された数値の左端がその数です。

考えたこと

幾つか対策を考えた

  1. ソースからビルドしてインストールし直す。
  2. 古いバージョンに戻す。
  3. 定期的にincrondを再起動してその場凌ぎをする。

1.ソースからビルドしてインストールし直す

この方法、一見確実な方法である様だが、後にincrondが更新された時にyumで出来要することが出来なくなってしまう。セキュリティホールなどの対応が疎かになってしまう可能性もある。
メンテナンス性が悪いんだよね。出来ればバグ修正が成されたバージョンが提供されるまで待ちたいところなのだが、私の環境下では緊急を要する状況にある。
だめだぁ~( ゚Д゚)

2.古いバージョンに戻す。

では、古いバージョンでは問題が発生していなかったので、バージョンを戻してやろう!
ということで、以下のコマンドで戻せるかチェックしてみる。

残念ながら、古いバージョンのincronは使えそうにない。
もし存在してくれていれば、こんな感じで対応が出来る。

実際やってみると解るが、今回の場合は古いバージョンが存在せず、結果「なにもしませんでした」という寂しいコメントが最後に記されるだけです。

3.定期的にincrondを再起動してその場凌ぎをする。

結局この方法に辿り着きました。

incrondにより生成されたゾンビプロセスは、incrondを再起動することにより削除されていましたので、crondでincrondを定期的に再起動してやることにしました。

まずはcrontabを起動して、定期的にコマンドを実行します。

これで、深夜0時00分にincrondが再起動します。

最後に

この現象は、CentOS7でしか発生していないみたいで、CentOS 6では古いバージョンが使えわれており問題は発生しない感じです。

また、incrondという特殊なパッケージを使っているので、この件に関して悩んでいる人は少ないでしょう

次のバージョンアップで更新されるでしょうし、需要は少ないと思っています。

とは言え、私の備忘録代わりに残しておきます。


concrete5 インストール

背景

concrete5をインストールしたのは覚えていたのですが、インストール方法が解らなくなったので、改めてインストールし直すという恥ずかしぃ〜思いをしながら、まとめ直すとにしました。

対象環境

ここではCentOS 7上に環境を構築します。
多少のパッケージインストール方法は省かせていただきますが、一般的な作業だけ省いているので、概ね問題ないでしょう(^^)

対象OS:CentOS 7.5.1804 (多分、7.xなら同じかと思います。)
他のパッケージ類は適宜インストールしますので、ここでの情報は以上となります。
ちなみにご自身の環境がどうなっているのか分からなければ以下を確認下さい。

ちなみに、作業は全てrootユーザで行います。
一般ユーザでもsudoなんかを使いながら作業を行なえば実現可能ですが、面倒なんで(^^;

準備作業

いつものことながら、インストールする前の準備運動ならぬ下地造りから入ります。

毎度お馴染みのepel-releaseリポジトリの設定ですね。

yum updateコマンドで全体をアップデートして置いた方がよいのですが、私の環境はNVIDIAのドライバをインストールしていたりいろいろと下手なパッケージを更新するとハレーションが発生する可能性があるので、敢えて行いませんが。。。やった方が良いです。

下地造りの前準備?が出来たところで実際に必要なパッケージをインストールします。

と、いきなり間違えました(^^;
単純にインストールすると、PHPのバージョンが古かったはずなので、上記の方法は辞めて以下の方法でインストールを行います。

まずremiで提供されているリポジトリを使えるようにします。

mariadbのインストール

Apache Web Server (httpd)のインストール

PHP5.6のインストール

concrete5 バージョン8以降ではPHPのバージョン 7.2以降を推奨しておりますが、私の環境は既に5.6の環境である程度構築されていたので、PHP5.6をベースにします。

PHPの古いバージョンが入っていた場合には適宜削除してインストール仕直す必要が生じます。(頑張ればなんとかなるなんて思わない方が良いですよw)

unzipのインストール

きっと入ってますよね。でも一応ね。

以上で準備作業は完了です。

concrete5本体のインストール

いつも思うんですけど、本来インストールしようとしているパッケージのインストール作業って、それ程大変じゃないんですよね。どちらかというと下地の準備の方が面倒なんですよね。
そこまできちんとして書いてくれれば嬉しいのですが。。。
そういった意味では、リポジトリって良くできてますよね。
と言っても、勝手にPHPのバージョンが上げられちゃったりすると困るので、結局こうなるのですが。。。

さて、前置きが長くなりましたが、本体のインストールです。

concrete5はWeb上で動作します。また、データベースを利用します。
ということで、httpdとMariaDBをセットアップしておく必要があるわけです。

httpdサービスを起動する。

Webサービスを利用できるように準備します。
毎度のことではありますが。。。

MariaDBサービスを起動する。

データベースサーバを起動します。

データベースサーバはこれで起動しますが、この後にデータベース自体を構築します。

データベースの作成

以下のコマンドを実行し、データベースを作成します。
なお、データベースの作成に関して、各種パラメタをサンプルです。実際のデータベース作成時には、ユーザIDやパスワードを十分に考慮して設定してください。

Firewallの設定

ファイアーウォールが有効になっていると思いますので、HTTPプロトコルが通過できるように設定を施します。

concrete5本体の設置

以下のURLをブラウザで開いて、最新版をダウンロードしましょう。
http://www.concrete5.org/download

Firefoxでダウンロードすると「ダウンロード」フォルダーに保存されますよね。

 

ここから適当なフォルダーへ移動して、解凍して、移動して、パーミッションの設定をイジイジして。。。。という流れを行います。

以上で設置完了です。

うぅーーーーーーー長い!

でも一応のインストールは出来たはずです。
ここからは、順次設定を進めます。

試しに、インストールしたconcrete5を覗いてみましょう!
以下のURLを指定すると閲覧できます。
(リモートで作業を行っている場合はIP

http://localhost/contents/

こんな画面が表示されれば、一応のインストール作業は完了です。

各種設定

言語設定

言語設定を変更します。
「日本語(日本)」を指定します。
#お好きにどうぞ!

環境チェック

実は、ここで「MSQL PDOエクステンションが有効です。」の項目がエラーになっていた。
インストール漏れはなく、設定もされていた。
結論は、Apacheが起動した状態でphp-pdoをインストールしたため、Apacheがphp-pdoを認識していなかったことが原因であった。
Apacheを再起動(systemctl restart httpd)を行うことで、認識した。

ここでは、チェックだけなので、問題がなければ「インストールを続ける」とし次へ進める。
ここで問題があった場合には、必要なパッケージをインストールするなどの対応が必要となる。

サイト情報登録

ここではサイトに関する情報を登録する。
「名前」はサイトの名称となります。
「管理者メールアドレス」は登録会員向けの発信元メールアドレスにもなります。その他、障害通知などもくるのかな?
「管理者パスワード」は編集する際などにログインする場合に使うパスワードになります。データベースのパスワードとは別にした方が良いでしょう。
データベースの各項目にはデータベース作成時に指定した内容を指定します。
今回の例では、
サーバー:localhost
MySQLユーザ名:concrete5
MySQLパスワード:cocrete5
データベース名:concrete5
となっていますが、実際のユーザ名パスワードデータベース名は十分の考慮の上設定してください。
セキュリティ上、上記の設定は宜しくありません。

「concrete5をインストール」ボタンでインストールが開始されます。

しばらく待ちます。

終わったら。。。

これで、concrete5のインストールは完了です。

「サイトを編集」ボタンをクリックすると、編集画面へ遷移します。

編集画面

編集画面をログアウトするには、右上のメニューボタンからログアウトすることが出来ます。

また再度ログインする際には、管理者ユーザが設定されています。
管理者のIDは「admin」です。
パスワードは、設定画面で設定したパスワードとなります。

ログインが上手く行かない場合には、ファイアーウォールを一度停止してみるとか、SELinuxを一度Permissiveにしてみるなどを試してみてください。

今回は以上です。
お疲れさまでした。

その内、操作方法などもアップしてみたいと思います。

cudaGetDeviceCount が-1だった。

OpenCVでcudaGetDeviceCountを用いて、Cudaが利用可能な状態か調べていたのだが、通常はデバイスの認識がされていないと0が返されるところで、-1が返されていた。

結論は、NVIDIAのドライバとcudaのバージョンが合わなかったためでした。

NVIDIAのドライバをバージョンアップすることで、解決しました。

QGIS でラインに対して平行なラベルを付けるには

QGISでラインに平行なラベルを付ける

QGIS 3.4が発表されているのに、今更2.18について何で書いてるのか・・・?という疑問は無視して、QGIS 2.xでラインに平行なラベルを書くための設定を説明します。

 

デフォルトの表示

QGISでラインに対し平行なラベルを表示させようとすると、回転角が上手く計算できずに困ったことはありませんか?
私は、いつも悩みます。
2点で構成された直線aに水平なラベルを描くのですが、回転角によって表示にバラツキが生じます。

デフォルトでは、こんな感じに表示されます。


図1 デフォルト表示

図1に示した表示はデフォルトでの表示例です。
一見、回転角に合わせて表示されている様にも見えますが、線分を360度回転させた時に必ず上もしくは左に表示されています。
今回の目的は、線分の始点(P1)と終点(P2)が反転した場合には、反転して表示して欲しいので、目的とは合いません。

この現象は、QGIS 3.xでも同じようになります。

ちなみに、図1の線分に平行して表示されている数値はP1→P2に向けた線分の回転角になります。

線分の回転角は以下の計算で算出しています。

【数式1】

 

線分の回転に合わせてラベルを回転させる

ここから、線分の回転角に合わせてラベルを回転させる設定を施します。

 

図2 ラベルの配置設定

ラベルの配置設定で以下の項目を設定します。
①「配置」→「許容される位置」→「ラインの方向に依存した位置」を指定します。
②回転の角度を指定します。
回転の角度は以下に示す数式を指定します。

【数式2】

数式1で示した計算で表示出来れば良いのですが、どうも線分の回転角とラベルの回転角は、回転方向が異なっている様です。
その為、「360-」とすることで、回転角を逆方向にしています。
更に、このままですと線分に対して垂直にラベルが表示されてしまうため、最後に「+90」をすることで水平な角度へ変換しています。

QGIS 3.xでは、この計算が異なります。
「360-」を除いた以下の数式になります。

【数式3】

 

次に、レンダリングの設定を変更します。

図3 ラベルのレンダリング設定

ラベルの「レンダリング」で「ラベルを逆さまに表示する」を「回転が指定されている場合」に設定します。

設定は以上になります。

結果は以下の通りです。

図4 結果表示

P1とP2が逆の場合は、応用問題ですから適当に数式を変更するなどの対処が必要となるかも知れませんが、概ねこれで参考情報にはなるでしょう。

【小ネタ】CentOS 6/7における安全なhttpd再起動の再起動方法

小ネタです。

今更感が強いです。

でもメモしておきます。

ここ最近、ブログさぼってました。
ついでに、Apache Http Server 2.2系から2.4系に移行しようとして、ガッツリ嵌ってしまいました。
その結果、ここのブログが10日ほど障害発生&クローズ状態が続いておりました。
閲覧者の方にはご迷惑をお掛けしたことと思います。
お詫び申し上げます。

さて、気を改めて、HTTPサーバを再起動する時に誰かが閲覧中だったりすると困りますよね。いきなりサーバが落ちて正常に反応してくれない!バグってる!!落ちた!!!

そんなことを少しでも起こさない様にしたい!ということで、今回の小ネタです。

CentOS 6における安全なHTTPサーバ再起動方法

コマンドはこんな感じです。

ご存知の方も多いですよね。
今更ですよね。
でも知らない人も多いんですよ。・・・きっとw

CentOS 7における安全なHTTPサーバ再起動方法

CentOS 7ではserviceコマンドが非推奨となってしまいました。
systemctlコマンドへ移行されています。
systemctlコマンドではgracefulのオプションがありません。
ではどうやってやるのか悩ましいところでもあったりします。
でも、以外に解り易いオプション名に変更になったのではないでしょうか?

ということで、コマンドは以下の通りです。

設定の「再読み込み」と覚えておけば、今までよりも解り易くないですか?私だけかな?

ということで、小ネタでした。

 

QGIS2.18と3.0.1のインストールした環境設定一覧

QGIS3.0.1と2.18を共存させた結果のインストーラのパッケージ選択画面を公開しておきます。
私の個人環境なので、他の人が必ずしも同じになるとは限りません。参考情報です。

トライされる方は、前の記事は以下です。

QGIS 3.xをインストールしてみた。QGIS 2.18と共存。

通常不要なものも含まれていると思いますので、ご自身でご判断下さい。

 

QGIS 3.xをインストールしてみた。QGIS 2.18と共存。

背景

QGIS 3.0がリリースされて、OSGeo4Wがインストールされていない綺麗な環境にインストールするのは、何も気にせずにインストール出来たのですが、QGIS 2.18がインストールされている環境にインストールしようとしたら、ちょっとだけ引っかかったので、記録に残します。

既に、QGIS 2.18.xがインストールされている環境を前提に進めます。
インストールを行った環境はWindows 10です。

追記:どうも、QGIS 2.18.xからだと上手く3.0.1をインストール出来たのですが、2.12からだとNGでした。そこで、私の環境設定内容を下記に貼り付けておきます。

QGIS2.18と3.0.1のインストールした環境設定一覧

はじめに

私は、QGIS 2.18.xを使用しており、いきなりQGIS 3.xへ更新するには抵抗がありました。使えなくなるプラグインなどがあり、仕事で使うにはちょっと困ります。
そこで、QGIS 2.18.xを残しつつ、QGIS 3.xをインストールしたいと思いました。

と言うことで、以下ではQGIS 2.18.xを残しながら、QGIS 3.xをインストールしてどちらも使用できる環境を構築します。
ただし、OSGeo4Wを使用していることを前提とします。

準備

準備と言いましても、特に何をダウンロードしてとか必要ありません。
新規でインストールされる方は、下記URLより環境に応じたインストーラをダウンロードしてください。

https://qgis.org/ja/site/forusers/download.html

 

OSGeo4WのSetupを起動します。

ここで、「アドバンスインストール」を選択します。

「インターネットからのインストール」で次へ

次も特に気にせず次へ

更に、次へ。

まだまだ次へ。

 

こいつも次へ・・・・楽々インストール?

やっと来ました!ここから本番です\(^o^)/

「Desktop」の前にある「+」ボタンをクリックして展開します。

ここでは既に3.xがインストールされた状態の画面を示していますが、上記の状態になる様に、インストール対象を選択します。

具体的には、以下の内容になります。

qgis:QGIS Desktop
qgis-dev
qgis-dev-pdb   <==必要ないかも?
qgis-full
qgis-full-dev
qgis-ltr            <==これは2.18を残すためです。それ以前のバージョンを使っている方は、更新されてしまいます。
qgis-ltr-full
qgis-rel-dev
qgis-rel-dev-pdb

これ以外は気にしないで大丈夫です。
上記の中にも不要なものが含まれているかも知れませんが、私の環境ではこんな感じでした。
間違って、3.0.0-4をインストールすると、上手く動作しませんでした。

これで、設定が終わりましたので、次へ進みます。

後は勝手にインストールが進みます。

!!!!!!!!!!!
ここで問題が!!!!!!!
!!!!!!!!!!!

OSGeo4WのSetupでインストールすると、qgis(Desktop)が最初は3.0.0-4しかインストール出来ません。
それが原因でQGIS 3.0を起動してもエラーで落ちる現象が確認できました。

解決方法は、再度、上記のインストール方法を繰り返すと、今度は3.0.1-1がインストール出来る様になります。
これでインストールし直すと、正常に起動出来る様になるみたいです。

Windowsメニューから両方のバージョンのQGISが起動することを確認してみてください。
一つの環境だけしか試していないので、大丈夫かな?

Rで日本語表示 Linux(CentOS)

Rで日本語表示が出来なくって困った。
RはCentOS上で動作しています。
CentOS 6でもCentOS 7でもどちらでも対応出来たので、記録します。

対策は、フォントを追加してやればOK!
凄く簡単だった。

で、本当にそれだけなんだろうか?たまたまそれで上手く行っただけかも知れないけど。。。。(^^ゞ

やったことは以下のコマンドを実行しただけ。

全然、Rに関して書いてないけど、Rで日本語表示出来る様になったんで・・・デフォルトのフォントがこれなんですね。

おしまい(^^♪

MariaDBを外部から接続できるようにするCentOS 7

MariaDBを外部サーバからアクセスできるように設定する。

MariaDBは前回導入しましたが、外部からアクセスできるように設定を行います。

外部とは、同一ネットワーク内のサーバからのみアクセスを許可します。全公開するとセキュリティを考慮する必要が生じますので、同一ネットワーク内としています。

環境

CentOS 7.4
MariaDB 10.1

作業項目

  1. ファイアウォールでMariaDBのサービスを許可する。
  2. MariaDB内に外部からアクセスを許可するユーザを作成する。
  3. MariaDBの設定を確認・調整する。

ファイアウォール設定

ファイアウォールにMariaDBのアクセスを許可します。
以下のコマンドで設定します。

firewalldの再起動は以下のコマンドでもOK!

これでfirewalldにmysqlのサービスが許可されました。
mysqlとしましたが、MariaDBは内部にmysqlを含んでいると考えてください。そして、mysqlが許可されればMariaDBへの許可が済んだことになります。

MariaDB内に外部からアクセスを許可するユーザを作成する。

今回は、内部ネットワークなのでrootユーザと同じレベルで作成します。

前回インストールしたMariaDBであれば、これだけでOKのはずです。

私が少し躓いたのは、間に物理的なファイアウォールやUTMを配したネットワークを経由した際に、そのハードルを越えるために設定を施す必要が生じたのですが、同一ネットワーク内であれば、ルータ代わりにUTMを使っている様な下手なことをしていなければこれでつながるはずです。

MariaDBの設定を確認・調整する。

基本的には必要ありませんが、/etc/my.confや/etc/my.conf.d/で設定しているconfファイルで、bind-addressを指定している場合には、その設定を見直す必要があります。

bind-addressで指定が行われている場合、外部からアクセスするアクセス元のIPアドレスを確認して登録します。

対象ファイルは
/etc/my.conf
それ以外は以下の様に確認しました。

これで何か設定が行われていれば、以下の様に接続元のIPアドレスを追加します。

こんな感じです。

以上で完了です。

最後に確認

最後に確認方法ですが・・・・

外部のマシンから以下のコマンドを実行します。

これでアクセスできない場合には、もう一度設定をみなしましょう。
それでも接続できない場合は、ネットワークに問題があるのかも知れません。ネットワーク管理者に相談してみるのも方法かと思います。