sh bash脚本使用单引号歧义redirect文件的pid

我的.sh文件中有以下新行

su --session-command='$javaCommandLine & >>$serviceLogFile 2>&1 & echo \$! >$pidFile' $serviceUser || return 1 

当我用双引号的时候,它有点奏效,但是pidFile有错误的PID,它被closures了。 从研究的解决scheme是使用单引号,我不能得到单引号工作。

我现在得到2个错误

bash:$ pidFile:模棱两可的redirect
bash:$ serviceLogFile:模棱两可的redirect

似乎我不能使用variables或输出到单引号variables?

这条线几乎可以工作,但是pid只有一个
下面的代码将从启动开始,但PID是错误的。

 su --session-command="$javaCommandLine & >>$serviceLogFile 2>&1 & echo \$! >$pidFile" $serviceUser || return 1 

这不得不取代这个马车旧的2行代码。

 cmd="nohup $javaCommandLine >>$serviceLogFile 2>&1 & echo \$! >$pidFile" # Don't forget to add -H so the HOME environment variable will be set correctly. sudo -u $serviceUser -H $SHELL -c "$cmd" || return 1 

旧的代码工作正常,但不能从启动启动。

进程标识是closures的,因为你在$javaCommandLine之后放了一个额外的& 。 换句话说,在调用echo $!之前,你已经在后台放了两个进程了echo $! ,从而得到>>$serviceLogFile 2>&1的PID而不是$javaCommandLine 。 这两个部分应该放在一个,如旧的2行代码所示

  su --session-command="$javaCommandLine & >>$serviceLogFile 2>&1 & echo \$! >$pidFile" $serviceUser || return 1 

您可能需要将其更改为 –

  su --session-command="$javaCommandLine >>$serviceLogFile 2>&1 & echo \$! >$pidFile" $serviceUser || return 1