分叉服务启动后是否立即重新启动?

时间:2019-08-06 07:46:23

标签: linux bash shell systemd

我正在使用以下systemd脚本,如下所示:

[Unit]
Description= TaskParticipant Service

[Service]
Type=forking
RemainAfterExit=no
ExecStart=/bin/bash bin/start-participant.sh
ExecStop=/bin/bash bin/stop-participant.sh
Restart=on-failure
WorkingDirectory=/opt/taskparticipant
User=javauser
Group=javauser
PrivateTmp=true
TimeoutSec=90
SuccessExitStatus=1

[Install]
WantedBy=multi-user.target

完成systemctl start tp

之后

我收到以下错误

[centos@mmanthena bin]$ sudo systemctl status tp.service 
● tp.service - TaskParticipant
   Loaded: loaded (/etc/systemd/system/tp.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since Tue 2019-08-06 07:20:19 GMT; 2s ago
  Process: 6635 ExecStop=/bin/bash bin/stop-participant.sh (code=exited, status=1/FAILURE)
  Process: 6504 ExecStart=/bin/bash bin/start-participant.sh (code=exited, status=0/SUCCESS)
 Main PID: 6577 (code=exited, status=1/FAILURE)

Aug 06 07:20:17 manthena systemd[1]: Starting TaskParticipant...
Aug 06 07:20:17 manthena bash[6504]: **************************************
Aug 06 07:20:17 manthena bash[6504]: Starting TaskParticipant
Aug 06 07:20:17 manthena bash[6504]: **************************************
Aug 06 07:20:18 manthena systemd[1]: Started - TaskParticipant.
Aug 06 07:20:19 manthena bash[6635]: Stopping Participant
#!/bin/bash

# JVM ARGUMENTS
jvm_min_heap_size="128m"
jvm_min_heap="-Xms${jvm_min_heap_size}"
jvm_max_heap_size="256m"
jvm_max_heap="-Xmx${jvm_max_heap_size}"


# GC Configuration
jvm_gc_options="-XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/acds/var"
jvm_gc_log_option="-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution -Xloggc:${logs_dir}/task-participant-gc.log"

jvm_arg_line="${jvm_min_heap} ${jvm_max_heap} ${jvm_gc_options} ${jvm_gc_log_option} -Dlog4j.configuration=task_participant_log4j.conf"

config_file_option="-cf ${conf_dir}/acds_taskmanager.conf"
host_name_option="-H ${HOSTNAME}"

java_arg_line="${config_file_option} ${host_name_option}"

# Run java
main_class=io.manoj.acds.taskparticipant.TaskParticipant
cmdline="java -cp ${cp} ${jvm_arg_line} ${main_class} ${java_arg_line} $*"

cd $root_dir

nohup $cmdline &
tp_pid=$(jps -l | grep io.manoj.acds.taskparticipant.TaskParticipant | awk '{print $1}')
echo ${tp_pid} > ${tp_pid_file}

我的期望是,该进程应在​​后台启动并运行,因为父级为bin / start-participant.sh并启动了Java进程,但我看到该进程在以systemctl开头时已重新启动

在手动启动时,它可以按预期工作(即直接运行脚本可以正常运行)

1 个答案:

答案 0 :(得分:0)

问题出在我相信的工作目录上。

如果您在bash_profilesbashrc中定义了systemd单元不使用的变量。 您可以为此使用EnvironmentFile=部分。

$root_dir变量很可能为空,因此cd $root_dir将工作主管从定义的系统单位(WorkingDirectory=/opt/taskparticipant)更改为javauser主目录。我认为这不是预期的行为。

如果您将行cd $root_dir更改为cd ${root_dir:?},则可以验证这一点,如果$root_dir变量为空,则脚本退出并出错。