分叉服务一启动就重新启动?



我有以下 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 启动时

重新启动

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

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

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

最有可能的是$root_dir变量是空的,所以cd $root_dir将工作控制器从定义的systemd单元(WorkingDirectory=/opt/taskparticipant(更改为javauser主目录。我认为这不是预期的行为。

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

最新更新