Monthly Archives: 7月 2015

tomcatの再起動がうまくいかないとき(Stop aborted)

サーバを再起動してtomcatが自動起動したと思ったらlocalhost:8080が表示できず、手動で起動しようとしたら既に起動しているというメッセージが出てくる。

仕方ないのでtomcatを再起動しようとすると、シャットダウン時に以下のようなエラーが出てくる

Shutting down tomcat
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr/java/default
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Using CATALINA_PID:    /var/run/catalina.pid
PID file found but no matching process was found. Stop aborted.

色々ぐぐってみると、/var/run/catalina.pidにプロセスIDがあるからそれをみてkillしろとか、

ps -ef | grep tomcat

で出てきたpidをkillしろという記事が多かったが、前者は「そのようなプロセスはありません」と言われてしまうし、後者はそもそもプロセスが無かったりで思うようにいかない。

/var/run/catalina.pid を消して再度起動させてみるも結果変わらず・・・

$CATALINA_HOME/logs/catalina.outでログを見てると

/usr/local/tomcat/bin/catalina.sh: line 387: /usr/java/default/bin/java: そのようなファイルやディレクトリはありません

あれ?

ある不安が脳裏をよぎる。

まず$CATALINA_HOME/bin/catalina.shの中身を見てみることに。

javaのパスが/usr/javaとなっていたが、このサーバではそこにjavaが存在しない・・・!

そういえば急遽tomcatが必要になったからjavaはデフォルトで入ってるOpenJDKを使っていて、ちゃんとJDKの最新版をダウンロードしてきてインストールしてなかった・・・

JDKを入れる

httpd停止→tomcat停止→tomcat起動→httpd起動の順で実行

うまくいった。

結論
tomcatを使うならJDKを入れましょう。

参考:

alternatives コマンドを使用した java バージョンの切り替え

Sun社のJDK7、OpenJDK、そしてIcedTea:曖昧さの回避

Sesameをインストールして管理画面に認証機能をつける

訳あってSesameをCentOSにインストールすることにした。

まずJava 6以上、Tomcat 7以上がインストールされていることが条件。

JavaとTomcatのインストールは「Javaアプリケーションサーバー構築(Tomcat6)」が非常に参考になる。

バージョンは古いので上の条件に置き換えること。

Sesameの公式ページのダウンロードリンクから最新版のtar.gzをダウンロードして解凍。

warフォルダ以下にある、openrdf-workbench.warとopenrdf-sesame.warを/usr/local/tomcat/webapps以下にコピー

$ tar zxvf openrdf-sesame-2.8.4-sdk.tar.gz
$ cd openrdf-sesame-2.8.4
$ cd war
$ cp openrdf-workbench.war /usr/local/tomcat/webapps/
$ cp openrdf-sesame.war /usr/local/tomcat/webapps/

これでSesameのインストールは完了。

localhost:8080/openrdf-workbenchにアクセスすると管理画面が見れるはず。

サーバの8080番ポートを開けていてworkbenchが誰でも外から見れる状態だとまずいので、簡単に認証機能をつけることにした。

$ vi /usr/local/tomcat/webapps/openrdf-workbench/WEB-INF/web.xml
# web-app要素内に以下を追記
<security-constraint>
  <web-resource-collection>
    <web-resource-name>Sesame Workbench</web-resource-name>
    <url-pattern>/*</url-pattern>
  </web-resource-collection>
  <auth-constraint>
    <role-name>sesame-user</role-name>
  </auth-constraint>
</security-constraint>

<login-config>
  <auth-method>DIGEST</auth-method>
  <realm-name>Sesame Workbench</realm-name>
</login-config>

<security-role>
  <description>The role required for Sesame workbench</description>
  <role-name>sesame-user</role-name>
</security-role>
$ vi /usr/local/tomcat/conf/tomcat-users.xml
# tomcat-users要素内に以下を追記
<role rolename="sesame-user"/>
<user username="ユーザ名" password="パスワード" roles="sesame-user"/>

apache終了→tomcat終了→tomcat起動→apache起動の順で再起動

これでlocalhost:8080/openrdf-workbenchにアクセスするとユーザ名とパスワードを求められると思う。

参考にしたサイトだとBASIC認証になっていたので、DIGEST認証に変更した。ユーザ名とパスワードは本当はDB連携して格納したほうが良いけど今回は簡易的な方法で行った。

参考:
How to set up a password for openrdf workbench?

Virtuosoでgraphごとに公開・非公開設定する

一つのVirtuosoに複数のRDFデータ(graph)をアップロードした時に、そのgraphごとに公開・非公開設定する方法は無いのかと模索していた。

$ isql
#まず全体を非公開に
SQL> DB.DBA.RDF_DEFAULT_USER_PERMS_SET('nobody',0);
#特定のものを公開設定する
SQL> DB.DBA.RDF_GRAPH_USER_PERMS_SET('http://example.com/', 'nobody', 1);

数値によってユーザに与えられる権限が変わるみたい。0だと完全非公開でconductorからもSPARQLエンドポイントからも検索できなくなるようだ。

virtuoso jdbc driver経由でプログラムからSPARQLかけることはできそうみたいな記事をどっかで見た気がするけど見失ってしまった。

参考:

How to hide graphs in a public endpoint in virtuoso ?

16.4.5. Initial Configuration of SPARQL Security.

Re: [Virtuoso-users] Set up private graph