2017年1月8日日曜日

JobScheduler をCentOS7のsystemd で自動起動/停止する


JobScheduler を CentOS7 の systemd で自動起動/停止するように設定してみました。

環境は、以下のとおり。
JobScheduler 用に admin ユーザを使用しています。
  • CentOS 7.3
  • JobScheduler 1.11.0-RC2

JobScheduler Engine


JobScheduler Engine は、自分で自動起動/停止を設定する必要があります。
systemd 用に設定ファイルを作成します。

[root@centos701 ~]# cat /etc/systemd/system/jobscheduler.service
[Unit]
Description=SOS JobScheduler
After=mariadb.service

[Service]
Type=forking
ExecStart=/opt/sos-berlin.com/jobscheduler/centos701_4444/bin/jobscheduler.sh start
ExecStop=/opt/sos-berlin.com/jobscheduler/centos701_4444/bin/jobscheduler.sh stop
PIDFile=/home/admin/sos-berlin.com/jobscheduler/centos701_4444/logs/scheduler.pid

[Install]
WantedBy=multi-user.target

systemd に認識されたか確認します。

[root@centos701 ~]# systemctl list-unit-files --type=service | grep jobscheduler
jobscheduler.service                          disabled

JobScheduler Engine の自動起動/停止を有効にします

[root@centos701 ~]# systemctl enable jobscheduler.service
Created symlink from /etc/systemd/system/multi-user.target.wants/jobscheduler.service to /etc/systemd/system/jobscheduler.service.
[root@centos701 ~]# systemctl list-unit-files --type=service | grep jobscheduler
jobscheduler.service                          enabled

JobScheduler Engine が systemd で起動するか試します。

[root@centos701 ~]# systemctl start jobscheduler.service
Job for jobscheduler.service failed because a configured resource limit was exceeded. See "systemctl status jobscheduler.service" and "journalctl -xe" for details.

上記のようなエラーがでたので、詳細なログを見てみると以下のとおり。
PIDファイルが読めなくてエラーになっているようです。

[root@centos701 ~]# systemctl status jobscheduler.service
● jobscheduler.service - SOS JobScheduler
   Loaded: loaded (/etc/systemd/system/jobscheduler.service; enabled; vendor preset: disabled)
   Active: failed (Result: resources) since 日 2017-01-08 22:52:45 JST; 2min 30s ago
  Process: 6085 ExecStop=/opt/sos-berlin.com/jobscheduler/centos701_4444/bin/jobscheduler.sh stop (code=exited, status=0/SUCCESS)
  Process: 6181 ExecStart=/opt/sos-berlin.com/jobscheduler/centos701_4444/bin/jobscheduler.sh start (code=exited, status=0/SUCCESS)
 Main PID: 5985 (code=exited, status=0/SUCCESS)

 1月 08 22:52:44 centos701 systemd[1]: Starting SOS JobScheduler...
 1月 08 22:52:44 centos701 jobscheduler.sh[6181]: Starting JobScheduler...
 1月 08 22:52:44 centos701 su[6196]: (to admin) root on none
 1月 08 22:52:45 centos701 systemd[1]: PID file /home/admin/sos-berlin.com/jobscheduler/centos701_4444/logs/scheduler.pid not readable (yet?) after start.
 1月 08 22:52:45 centos701 systemd[1]: Failed to start SOS JobScheduler.
 1月 08 22:52:45 centos701 systemd[1]: Unit jobscheduler.service entered failed state.
 1月 08 22:52:45 centos701 systemd[1]: jobscheduler.service failed.

systemd はエラーになっていますが、JobScheduler Engine は起動しており、PIDファイルも作成されています。

[root@centos701 ~]# ps -ef | grep job
admin     6218     1 10 22:52 ?        00:00:23 /opt/sos-berlin.com/jobscheduler/centos701_4444/bin/scheduler -service -id=centos701_4444 -sos.ini=/home/admin/sos-berlin.com/jobscheduler/centos701_4444/config/sos.ini -ini=/home/admin/sos-berlin.com/jobscheduler/centos701_4444/config/factory.ini -config=/home/admin/sos-berlin.com/jobscheduler/centos701_4444/config/scheduler.xml -param=/home/admin/sos-berlin.com/jobscheduler/centos701_4444 -cd=/home/admin/sos-berlin.com/jobscheduler/centos701_4444 -include-path=/home/admin/sos-berlin.com/jobscheduler/centos701_4444 -pid-file=/home/admin/sos-berlin.com/jobscheduler/centos701_4444/logs/scheduler.pid
root      6369  2421  0 22:56 pts/0    00:00:00 grep --color=auto job
[root@centos701 ~]# ls -l /home/admin/sos-berlin.com/jobscheduler/centos701_4444/logs/scheduler.pid
-rw-r--r-- 1 admin admin 5  1月  8 22:52 /home/admin/sos-berlin.com/jobscheduler/centos701_4444/logs/scheduler.pid

そこで、PIDファイルが作成されるタイミングの問題かと思い、JobScheduler Engine の起動スクリプト(/opt/sos-berlin.com/jobscheduler/centos701_4444/bin/jobscheduler.sh)に sleep を入れてみました。(赤字部分)

    start)   # some applications need X-Server
             # export DISPLAY=:1
             # $SH "Xvfb :1" &
             # echo $! > $SCHEDULER_DATA/logs/Xvfb.pid

             if running
             then
               SCHEDULERPID=`cat "${SCHEDULER_PID}"`
               echo "...JobScheduler is already running with pid=${SCHEDULERPID}!"
               exit 0
             fi
                                         shift
             if [ "$1" = "paused" ]
             then
               echo "Starting JobScheduler paused..."
               SCHEDULER_SECOND_ARG="-cmd=\"<modify_spooler cmd='pause'/>\""
               shift
             else
               echo "Starting JobScheduler..."
               SCHEDULER_SECOND_ARG=""
             fi

             apply_cluster_options "$@"
             apply_pause_after_failure "$@"
             SCHEDULER_ARGS="\"$SCHEDULER_BIN\" $SCHEDULER_ARGS $SCHEDULER_START_PARAMS $SCHEDULER_SECOND_ARG"

             start_jobscheduler
             remember_status
             sleep 2
             ;;

    start_safe|start-safe)

起動中の JobScheduler Engine を停止して、もう一度、試します。

[root@centos701 ~]# /opt/sos-berlin.com/jobscheduler/centos701_4444/bin/jobscheduler.sh stop

JobScheduler Engine を起動すると、今度は成功しました。

[root@centos701 ~]# systemctl start jobscheduler.service
[root@centos701 ~]# systemctl status jobscheduler.service
● jobscheduler.service - SOS JobScheduler
   Loaded: loaded (/etc/systemd/system/jobscheduler.service; enabled; vendor preset: disabled)
   Active: active (running) since 日 2017-01-08 23:04:09 JST; 7s ago
  Process: 6085 ExecStop=/opt/sos-berlin.com/jobscheduler/centos701_4444/bin/jobscheduler.sh stop (code=exited, status=0/SUCCESS)
  Process: 6674 ExecStart=/opt/sos-berlin.com/jobscheduler/centos701_4444/bin/jobscheduler.sh start (code=exited, status=0/SUCCESS)
 Main PID: 6712 (scheduler)
   CGroup: /system.slice/jobscheduler.service
           ‣ 6712 /opt/sos-berlin.com/jobscheduler/centos701_4444/bin/scheduler -service -id=centos701_4444 -sos.ini=/home/admin/sos-berlin.com/jobscheduler/centos701_4444/...

 1月 08 23:04:06 centos701 systemd[1]: Starting SOS JobScheduler...
 1月 08 23:04:06 centos701 jobscheduler.sh[6674]: Starting JobScheduler...
 1月 08 23:04:06 centos701 su[6688]: (to admin) root on none
 1月 08 23:04:09 centos701 systemd[1]: Started SOS JobScheduler.

停止できるか、試すと、成功しました。

[root@centos701 ~]# systemctl stop jobscheduler.service
[root@centos701 ~]# systemctl status jobscheduler.service
● jobscheduler.service - SOS JobScheduler
   Loaded: loaded (/etc/systemd/system/jobscheduler.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since 日 2017-01-08 23:05:10 JST; 6s ago
  Process: 6814 ExecStop=/opt/sos-berlin.com/jobscheduler/centos701_4444/bin/jobscheduler.sh stop (code=exited, status=0/SUCCESS)
  Process: 6674 ExecStart=/opt/sos-berlin.com/jobscheduler/centos701_4444/bin/jobscheduler.sh start (code=exited, status=0/SUCCESS)
 Main PID: 6712 (code=exited, status=0/SUCCESS)

 1月 08 23:05:07 centos701 jobscheduler.sh[6814]: ........... job chains: 14
 1月 08 23:05:07 centos701 jobscheduler.sh[6814]: ................. jobs: 26
 1月 08 23:05:07 centos701 jobscheduler.sh[6814]: ....... enqueued tasks: 0
 1月 08 23:05:07 centos701 jobscheduler.sh[6814]: ............... orders: 10
 1月 08 23:05:07 centos701 jobscheduler.sh[6814]: ..... remote instances: 0, connected instances:
 1月 08 23:05:07 centos701 jobscheduler.sh[6814]: ________________________________________________________________________
 1月 08 23:05:07 centos701 jobscheduler.sh[6814]: No jobs are running for this instance
 1月 08 23:05:07 centos701 jobscheduler.sh[6814]: Shutting down JobScheduler...
 1月 08 23:05:08 centos701 jobscheduler.sh[6814]: <?xml version="1.0" encoding="ISO-8859-1"?><spooler><answer time="2017-01-08T14:05:08.669Z"><ok/></answer></spooler>
 1月 08 23:05:10 centos701 systemd[1]: Stopped SOS JobScheduler.


JOC Cockpit


JOC Cockpit は、インストール時に、自動起動/停止が設定されます。
/etc/init.d/joc が起動/停止用のスクリプトです。

[root@centos701 ~]# ls /etc/init.d/
README  functions  joc  netconsole  network

手動での起動/停止は以下のように実行します。

[root@centos701 ~]# /etc/init.d/joc stop
Stopping Jetty: OK
[root@centos701 ~]# /etc/init.d/joc start
Starting Jetty: StartLog to /home/admin/sos-berlin.com/joc/logs/start.log
2017-01-08 23:09:25.518:INFO::main: Logging initialized @1627ms
2017-01-08 23:09:25.754:INFO::main: Redirecting stderr/stdout to /var/log/sos-berlin.com/joc/2017_01_08.stderrout.log
. . OK 2017年  1月  8日 日曜日 23:09:35 JST