Estou tentando configurar nossa instalação do Sybase para ser executada no systemd.
Os comandos básicos são abordados aqui mas quando a controlamos manualmente, iniciamos com o seguinte comando (o startserver sai depois de executar os scripts RUN_SYBASE)
su - sybase
cd sqlserver/install
startserver -f RUN_SYBASE_localhost_back
startserver -f RUN_SYBASE_localhost
Podemos ver detalhes dos processos iniciados
[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
E para desligar o sybase precisamos executar um comando no próprio 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
Isto é o que eu tenho para um script até agora, o su e source ~/SYBASE.sh
é porque isso é usado pelo bashrc mas O systemd não roda o bashrc . O / opt / sap / stop_sybase_command é simplesmente a string de várias linhas digitada no sybase para desligar o servidor.
[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
Usando o systemctl start o sybase.service é executado corretamente e cria o servidor, mas acaba alegando que ele falhou, acredito que os comandos do startserver saiam após o início do sybase
Active: failed (Result: exit-code) since Tue 2015-08-25 21:52:43 EDT; 11s ago
Eu tentei usar Type=forking
, mas isso fez com que ele falhasse até mais cedo.
[root@localhost ~]# systemctl start sybase.service
Job for sybase.service failed. See 'systemctl status sybase.service' and 'journalctl -xn' for details.
Mas de qualquer forma ele inicia, mas parar não funciona, se eu tentar o comando stop como root ele funciona bem
[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 ~]#
Mas quando eu tento parar de usar systemctl, tudo o que vejo na parte de status do log é o comando aparentemente com falha
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)
E quanto ao log em si, a única coisa impressa em resposta ao comando stop é a seguinte
Aug 25 21:59:48 localhost.localdomain systemd[1]: Stopped Sybase ASE Server 16.0.
Estou tentando corrigir três problemas com esse script.
- Emita um comando de início sem o systemd pensar que ele falhou
- Emita um comando de parada que realmente pare o sybase
- O status fornece feedback sobre se os processos mostrados por
showserver
estão sendo executados
obrigado
ATUALIZAÇÃO: Seguindo o conselho do meuh, eu usei o seguinte script que parece fazer o que eu preciso
[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
Respondendo à pergunta de mueh, o processo parece estar incluído no grupo de controle, mas quando eu o mato manualmente, o processo é removido.
[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 ~]#
Sim, e eu não tenho certeza de quais são os caracteres, é apenas uma coisa estranha que aparece em todo lugar quando eu estou ssh'd na VM (eu suponho que é uma coisa de codificação inofensiva )