Sybase ASE용 systemd 스크립트 생성

Sybase ASE용 systemd 스크립트 생성

systemd에서 실행되도록 Sybase 설치를 설정하려고 했습니다.

이것기본 명령은 여기에서 다룹니다.하지만 수동으로 제어할 때는 다음 명령을 사용하여 시작합니다. (startserver는 RUN_SYBASE 스크립트를 실행한 후 종료됩니다.)

su - sybase
cd sqlserver/install
startserver -f RUN_SYBASE_localhost_back
startserver -f RUN_SYBASE_localhost

시작 프로세스의 세부 사항을 볼 수 있습니다

[sybase@localhost install]$ showserver 
F S UID        PID  PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
0 S sybase   14072 14068  7  80   0 - 157888 futex_ 18:41 ?       00:11:26 /opt/sap/ASE-16_0/bin/dataserver -d/opt/sap/data/master.dat -e/opt/sap/ASE-16_0/install/SYBASE_localhost.log -c/opt/sap/ASE-16_0/SYBASE_localhost.cfg -M/opt/sap/ASE-16_0 -N/opt/sap/ASE-16_0/sysam/SYBASE_localhost.properties -i/opt/sap -sSYBASE_localhost
0 S sybase   14066 14063  0  80   0 -  6521 poll_s 18:41 ?        00:00:00 /opt/sap/ASE-16_0/bin/backupserver -e/opt/sap/ASE-16_0/install/SYBASE_localhost_back.log -N25 -C20 -I/opt/sap/interfaces -M/opt/sap/ASE-16_0/bin/sybmultbuf -SSYBASE_localhost_back

Sybase를 종료하려면 Sybase 자체에서 명령을 실행해야 합니다.

[sybase@localhost ~]$  isql -Usa -Ppassword -SSYBASE_localhost << EOF_INPUT
shutdown SYB_BACKUP with nowait
go
shutdown
go
EOF_INPUT

Backup Server: 3.48.1.1: The Backup Server will go down immediately. 
Terminating sessions.
Server SHUTDOWN by request.
ASE is terminating this process.
CT-LIBRARY error:
        ct_results(): network packet layer: internal net library error: Net-Library operation terminated due to disconnect
[sybase@localhost ~]$ echo $?  # yes the error was expected
0

source ~/SYBASE.sh이것은 bashrc에서 사용되는 su 스크립트입니다 . 하지만systemd는 bashrc를 실행하지 않습니다. /opt/sap/stop_sybase_command는 서버를 종료하기 위해 sybase에 입력한 여러 줄의 문자열입니다.

[Unit]
Description=Sybase ASE Server 16.0

[Service]
ExecStart=/bin/su sybase -c "source ~/SYBASE.sh; /opt/sap/ASE-16_0/bin/startserver -f /opt/sap/sqlserver/install/RUN_SYBASE_localhost_back; /opt/sap/ASE-16_0/bin/startserver -f /opt/sap/sqlserver/install/RUN_SYBASE_localhost"
ExecStop=/bin/su sybase -c "source ~/SYBASE.sh; /opt/sap/client/bin/isql -Usa -Ppassword -SSYBASE_localhost < /opt/sap/stop_sybase_command"
WorkingDirectory=/opt/sap/ASE-16_0/install/

[Install]
WantedBy=multi-user.target

systemctl start sybase.service를 사용하면 정상적으로 실행되고 서버가 생성되지만 결국 실패한다고 주장합니다. sybase를 시작한 후 startserver 명령이 종료되기 때문이라고 생각합니다.

Active: failed (Result: exit-code) since Tue 2015-08-25 21:52:43 EDT; 11s ago

반대의 접근 방식을 사용해 보았지만 Type=forking이로 인해 더 일찍 실패했다고 생각하게 되었습니다.

[root@localhost ~]# systemctl start sybase.service 
Job for sybase.service failed. See 'systemctl status sybase.service' and 'journalctl -xn' for details.

그러나 어느 쪽이든 시작되지만 중지가 전혀 작동하지 않습니다. 루트로 중지 명령을 시도하면 제대로 작동합니다.

[root@localhost ~]# /bin/su sybase -c "source ~/SYBASE.sh; /opt/sap/client/bin/isql -Usa -Ppassword -SSYBASE_localhost < /opt/sap/stop_sybase_command"
Backup Server: 3.48.1.1: The Backup Server will go down immediately. 
Terminating sessions.
Server SHUTDOWN by request.
ASE is terminating this process.
CT-LIBRARY error:
        ct_results(): network packet layer: internal net library error: Net-Library operation terminated due to disconnect
[root@localhost ~]# 

하지만 systemctl 사용을 중지하려고 하면 로그의 상태 섹션에 명령이 실패한 것으로 보입니다.

  Process: 20961 ExecStop=/bin/sh -c /bin/su sybase -c "source ~/SYBASE.sh; /opt/sap/client/bin/isql -Usa -Ppassword -SSYBASE_localhost < /opt/sap/stop_sybase_command" (code=exited, status=255)

로그 자체의 경우 stop 명령에 대한 응답으로 인쇄되는 유일한 내용은 다음과 같습니다.

Aug 25 21:59:48 localhost.localdomain systemd[1]: Stopped Sybase ASE Server 16.0.

나는 이 스크립트의 세 가지 문제를 해결하려고 노력하고 있습니다.

  1. 시작 명령을 실행하면 systemd는 실패했다고 생각하지 않습니다.
  2. 실제로 Sybase를 중지하는 중지 명령을 실행합니다.
  3. 상태가 표시된 프로세스가 showserver실행 중인지 여부에 대한 피드백을 제공하도록 합니다.

감사해요

고쳐 쓰다:meuh가 제안한대로 필요한 작업을 수행하는 다음 스크립트를 사용했습니다.

[Unit]
Description=Sybase ASE Server 16.0

[Service]
# Systemd executes a single command with su -c which ignores the bashrc setting our environment, instead su to sybase and run the SYBASE.sh directly

# Could strictly be two services but we'll be lazy and just do one. After starting the backup and main server we find the pid of the main server and drop it into a PID file
ExecStart=/bin/su sybase -c "source ~/SYBASE.sh; /opt/sap/ASE-16_0/bin/startserver -f /opt/sap/sqlserver/install/RUN_SYBASE_localhost_back; /opt/sap/ASE-16_0/bin/startserver -f /opt/sap/sqlserver/install/RUN_SYBASE_localhost; showserver | sed '2q;d'| awk '{ print $4 }' > /opt/sap/sqlserver/install/sybase.pid"

# Shutting down we actually have to issue the command from inside sybase
ExecStop=/bin/sh -c '/bin/su sybase -c "source ~/SYBASE.sh; /opt/sap/client/bin/isql -Usa -Ppassword -SSYBASE_localhost < /opt/sap/stop_sybase_command"'

# The startserver commands exits so we need to track the fork, listed in sybase.pid
Type=forking
PIDFile=/opt/sap/sqlserver/install/sybase.pid
WorkingDirectory=/opt/sap/ASE-16_0/install/

[Install]
WantedBy=multi-user.target

mueh 님의 질문에 답변드리자면 해당 프로세스가 컨트롤 그룹에 포함되어 있는 것 같은데, 수동으로 kill 시키면 해당 프로세스가 삭제됩니다.

[root@localhost ~]# systemctl status sybase.service |head -7
sybase.service - Sybase ASE Server 16.0
   Loaded: loaded (/etc/systemd/system/sybase.service; enabled)
   Active: active (running) since Wed 2015-09-02 02:41:40 EDT; 23s ago
  Process: 23384 ExecStop=/bin/sh -c /bin/su sybase -c "source ~/SYBASE.sh; /opt/sap/client/bin/isql -Usa -Pscadacom -SSYBASE_localhost < /opt/sap/stop_sybase_command" (code=exited, status=255)
 Main PID: 23431 (backupserver)
   CGroup: /system.slice/sybase.service
           ��� 23431 /opt/sap/ASE-16_0/bin/backupserver -e/opt/sap/ASE-16_0/install/SYBASE_localhost_back.log -N25 -C20 -I/opt/sap/interfaces -M/opt/sap/ASE-16_0/bin/sybmultbuf -SSYBASE_localhost_back
[root@localhost ~]# kill 23431
[root@localhost ~]# systemctl status sybase.service |head -7
sybase.service - Sybase ASE Server 16.0
   Loaded: loaded (/etc/systemd/system/sybase.service; enabled)
   Active: active (running) since Wed 2015-09-02 02:41:40 EDT; 1min 56s ago
  Process: 23384 ExecStop=/bin/sh -c /bin/su sybase -c "source ~/SYBASE.sh; /opt/sap/client/bin/isql -Usa -Pscadacom -SSYBASE_localhost < /opt/sap/stop_sybase_command" (code=exited, status=255)
 Main PID: 23431
   CGroup: /system.slice/sybase.service

[root@localhost ~]# 

예, ��� 문자가 어디서 왔는지 잘 모르겠습니다. VM에 SSH로 접속하면 여기저기서 이상한 내용이 나타납니다(무해한 인코딩이라고 생각했습니다).

답변1

이것이 제가하는 것입니다. 포크 또는 pid 파일이 필요하지 않으며 sybase 사용자로 실행할 수 있습니다. Kill 명령을 사용하여 데이터 서버를 중지하는 데 만족한다면 ExecStop이 필요하지 않습니다.

유닛 파일... /etc/systemd/system/sybase-srvnane

각 Sybase 서버에 대해 별도의 단위 파일을 추가합니다.

[단위]
설명=Sybase 데이터 서버

[제공하다]
사용자=사이베이스
ExecStart=/home/sybase/bin/run-dataserver SRVNAME
ExecStop=/home/sybase/bin/stop-dataserver SRVNAME

[설치하다]
WantedBy=다중 사용자.대상

시작 스크립트.../home/sybase/bin/run-dataserver

#!/bin/sh

[ $# -ne 1 ] && echo "사용법: $0 <SYB_SERVER>" && 종료 1
_서버=${1}
. /opt/sybase/SYBASE.sh
_run_file=${SYBROOT}/${SYBASE_ASE}/install/RUN_${_server}
if [ -x ${_run_file} ]
그 다음에
        echo "Sybase 서버 시작 중...${_server}"
        . ${_run_file}
기타
        echo "실행 파일 ${_run_server}을(를) 찾을 수 없습니다."
        1번출구
필리핀 제도

스크립트 중지... /home/sybase/bin/stop-dataserver

#!/bin/bash

[ $# -ne 1 ] && echo "사용법: $0 <SYB_SERVER>" && 종료 1
_서버=${1}
. /opt/sybase/SYBASE.sh
_isql=${SYBROOT}/${SYBASE_OCS}/bin/isql
if [ -x ${_isql} ]
그 다음에
        echo "Sybase 서버를 중지하는 중...${_server}"
        ${_isql} -U sa -S ${_server} << EOF
$(cat/home/sybase/.sa_password)
폐쇄
가다
EOF

필리핀 제도

완전성을 위해 백업 서버도 중지했습니다... /home/sybase/bin/start-backup-dataserver

#!/bin/bash

[ $# -ne 1 ] && echo "사용법: $0 <SYB_SERVER>" && 종료 1
_서버=${1}
. /opt/sybase/SYBASE.sh
_isql=${SYBROOT}/${SYBASE_OCS}/bin/isql
if [ -x ${_isql} ]
그 다음에
        echo "Sybase 백업 서버를 중지하는 중...${_server}"
        ${_isql} -U sa -S ${_server} << EOF
$(cat/home/sybase/.sa_password)
SYB_BACKUP 끄기
가다
EOF

필리핀 제도

/home/sybase/.sa_password 파일만 비밀번호로 읽는 사용자가 있습니다.

sudo systemctl daemon-reload이제 끝났습니다.

답변2

데이터 서버의 프로세스 ID를 입력해야 하는 파일 이름으로 항목을 추가해 보십시오 [Service]. 예를 들어 명령을 통해 이 pid를 얻으려면 줄을 PIDFile=편집하세요 . Sybase가 그러한 파일을 생성했을 수 있습니다. 다시 사용해야 할 수도 있습니다 .ExecStartshowserverType=forking

exit 0예를 들어, 끝에 추가하여 Exec 스크립트의 종료 코드가 0인지 확인하세요(작동하지만 systemd가 작동하지 않는 경우).


어쩌면 귀하의 프로세스가 어떻게 든 통제 그룹을 떠났을 수도 있습니다. 테스트 서비스로 다음을 사용하고 있습니다./etc/systemd/system/myscript.service

[Unit]
Description=Try Forking using PIDFile
After=syslog.target
[Service]
Type=Forking
PIDFile=/tmp/mypid
ExecStart=/bin/bash -c '( (nohup sleep 99999 & echo $! >/tmp/mypid )& sleep 5 )'
ExecStop=/bin/bash -c 'kill -1 $(</tmp/mypid); >/tmp/mypid; exit 0'
[Install]
WantedBy=multi-user.target

나는 이것을 시작했다

$ sudo systemctl daemon-reload
$ sudo systemctl enable myscript
$ sudo systemctl start myscript
$ sudo systemctl status myscript;echo $?
   Loaded: loaded (/etc/systemd/system/myscript.service; enabled)
   Active: active (running) since  09:01:33 CEST; 2s ago
 Main PID: 25485 (bash)
   CGroup: /system.slice/myscript.service
       |-25485 /bin/bash -c ( (nohup sleep 99999 & echo $! >/tmp/mypid )&...
       |-25486 /bin/bash -c ( (nohup sleep 99999 & echo $! >/tmp/mypid )&...
       |-25488 sleep 5
       `-25489 sleep 99999

5초 후에는 상태에 절전 실행 중만 ​​표시됩니다. 해당 pid는 에 있습니다 /tmp/mypid.

$ sudo systemctl status myscript;echo $?
   Active: active (running) since  09:01:33 CEST; 11s ago
 Main PID: 25489 (sleep)
   CGroup: /system.slice/myscript.service
       `-25489 sleep 99999

상태에 표시된 대로 작동이 중지되었습니다.

$ sudo systemctl stop myscript;echo $?
0
$ sudo systemctl status myscript;echo $?
   Active: inactive (dead) since  09:01:55 CEST; 4s ago
  Process: 25504 ExecStop=/bin/bash -c kill ...
  Process: 25489 ExecStart=/bin/bash -c ( (nohup sleep ...
 Main PID: 25489 (code=killed, signal=TERM)
3

재부팅하고 수동으로 절전 모드를 종료하면 systemd는 프로세스 종료를 즉시 인식하고 ExecStop을 실행하고 /tmp/mypid중지하지 않고 파일을 삭제합니다.

$ sudo systemctl start myscript
$ sudo kill -15 $(</tmp/mypid) # pid 25529
$ ps -p $(</tmp/mypid)
   bash: /tmp/mypid: No such file or directory
$ sudo systemctl status myscript;echo $?
   Active: inactive (dead) since  09:03:53 CEST; 9s ago
  Process: 25568 ExecStop=/bin/bash -c kill
  Process: 25529 ExecStart=/bin/bash -c ( (nohup sleep
 Main PID: 25529 (code=killed, signal=TERM)
   09:02:38 systemd[1]: Started Try Forking using PIDFile.
   09:03:53 bash[25568]: /bin/bash: line 0: kill: (25529) - No suc...ss
3
$ sudo systemctl disable myscript;echo $?

답변3

suUser=사용자 대신 키를 사용하여 유닛 파일에서 사용자를 설정할 수 있습니다.

답변4

많은수년 전에 이 작업을 수행한 분들께 감사드립니다. 나는 귀하의 최고의 조언과 내 작업 중 일부를 혼합하여 다음과 같이 성공했습니다.

[Unit]
Description=Sybase ASE Server 16.0
After=network.target

[Service]
Environment=PW=sapassword DS=SERVERNAME
WorkingDirectory=/opt/sap/ASE-16_0/install/
Type=forking

ExecStart=/sbin/runuser sybase -c ". ../../SYBASE.sh; startserver -f RUN_${DS} -f RUN_${DS}_back"
ExecStop= /sbin/runuser sybase -c ". ../../SYBASE.sh; printf 'shutdown\ngo' | isql -Usa -P$PW -S$DS"
    
[Install]
WantedBy=multi-user.target

나는 모든 것을 하나의 파일에 담는 단순함을 좋아하며 몇 가지 문제를 해결합니다.

  • 모든 프로세스를 단일 제어 그룹에 유지하는 /sbin/runuser대신 사용하세요 . /bin/su이렇게 하면 서비스가 다른 서비스처럼 작동하게 됩니다. 즉, systemctl status sybase.service서비스를 실행하면 서비스가 실행 중임을 나타내며 systemctl stop sybase.service, 정상적인 종료를 실행하는 것 외에도 백업 서버에 TERM을 보냅니다. runuser아마도 SELinux를 사용하는 사람들에게만 필요할 것 같지만 나에게는 많은 의미가 있습니다. 분명히 runuser는 루트가 권한이 낮은 사용자로 전환되는 상황을 위해 만들어졌습니다.
  • Environment=이 파일을 우리 서버에서 실행하려면 한 줄만 편집하면 됩니다 .
  • 암호를 환경에 입력하면 누군가 암호를 실행할 때 암호가 노출되는 것을 방지할 수 있습니다 systemctl status sybase.server. 실제 파일은 루트에서만 읽을 수 있습니다.
  • After=network.target부팅 시 백업 서버가 시작되는지 확인
  • systemd는 PIDfile에 대해 유용한 작업을 수행하지 않으므로 생략하겠습니다.

관련 정보