运行 spring 将 jar 作为服务启动时出现意外标记附近的语法错误
Syntax error near unexpected token when running spring boot jar as service
我想 运行 我的 Spring 基于引导的应用程序作为使用 init.d 的服务(服务器是 Redhat 5.9)。
当运行宁service myapp start
或/etc/init.d/myapp start
时,我得到以下错误:
/etc/init.d/myapp: line 168: syntax error near unexpected token `>'
/etc/init.d/myapp: line 168: ` $command &>> "$log_file" &
我运行sh -x /etc/init.d/myapp status
想看看是怎么回事,但对我帮助不大。这是输出的最后一部分:
+ PID_FOLDER=/var/run/myapp
+ pid_file=/var/run/myapp/myapp.pid
+ log_file=/app/myapp//myapp.log
++ id -u
+ [[ 0 == [=13=] ]]
++ awk '{print }'
++ ls -ld /app/myapp/myapp-server-0.0.1-SNAPSHOT.jar
+ run_user=myapp
+ [[ -n /usr/java/default ]]
+ [[ -x /usr/java/default/bin/java ]]
+ javaexe=/usr/java/default/bin/java
+ command='/usr/java/default/bin/java -Dsun.misc.URLClassPath.disableJarChecking=true -jar /app/myapp/myapp-server-0.0.1-SNAPSHOT.jar '
/etc/init.d/myapp: line 168: syntax error near unexpected token `>'
/etc/init.d/myapp: line 168: ` $command &>> "$log_file" &'
我的 jar 旁边也有一个 .conf
文件:
[root@appdev02 myapp]# cat myapp-server-0.0.1-SNAPSHOT.conf
MODE=service
LOG_FOLDER=/app/myapp/
JAVA_HOME=/usr/java/default
我正在使用 Spring Boot 1.3.1
更新:
我降级到 Spring Boot 1.3.0 并且开始工作:
[root@appdev02 ~]# service myapp start
which: no start-stop-daemon in (/sbin:/usr/sbin:/bin:/usr/bin)
Started [19564]
我 运行 在 OSX 上解决了这个问题,这是因为旧版本的 bash 不喜欢 &>> "$log_file" 重定向语法.参见 https://www.gnu.org/software/bash/manual/bashref.html。要恢复到原始 bash 语法更改:
$command &>> "$log_file" &
至:
$command >> "$log_file" 2>&1
我注意到原始语法在脚本的其他地方使用,我会建议 Spring 引导人员在他们的根脚本中进行更改。
在那之前,我建议复制脚本,进行上述编辑,保存新脚本并将其用作 embeddedLanchScript - 如果使用 mvn,则这样做:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable
<embeddedLaunchScript>${basedir}/src/main/resources/embeddedLaunchScript.bash</embeddedLaunchScript>
</configuration>
</plugin>
我想 运行 我的 Spring 基于引导的应用程序作为使用 init.d 的服务(服务器是 Redhat 5.9)。
当运行宁service myapp start
或/etc/init.d/myapp start
时,我得到以下错误:
/etc/init.d/myapp: line 168: syntax error near unexpected token `>'
/etc/init.d/myapp: line 168: ` $command &>> "$log_file" &
我运行sh -x /etc/init.d/myapp status
想看看是怎么回事,但对我帮助不大。这是输出的最后一部分:
+ PID_FOLDER=/var/run/myapp
+ pid_file=/var/run/myapp/myapp.pid
+ log_file=/app/myapp//myapp.log
++ id -u
+ [[ 0 == [=13=] ]]
++ awk '{print }'
++ ls -ld /app/myapp/myapp-server-0.0.1-SNAPSHOT.jar
+ run_user=myapp
+ [[ -n /usr/java/default ]]
+ [[ -x /usr/java/default/bin/java ]]
+ javaexe=/usr/java/default/bin/java
+ command='/usr/java/default/bin/java -Dsun.misc.URLClassPath.disableJarChecking=true -jar /app/myapp/myapp-server-0.0.1-SNAPSHOT.jar '
/etc/init.d/myapp: line 168: syntax error near unexpected token `>'
/etc/init.d/myapp: line 168: ` $command &>> "$log_file" &'
我的 jar 旁边也有一个 .conf
文件:
[root@appdev02 myapp]# cat myapp-server-0.0.1-SNAPSHOT.conf
MODE=service
LOG_FOLDER=/app/myapp/
JAVA_HOME=/usr/java/default
我正在使用 Spring Boot 1.3.1
更新: 我降级到 Spring Boot 1.3.0 并且开始工作:
[root@appdev02 ~]# service myapp start
which: no start-stop-daemon in (/sbin:/usr/sbin:/bin:/usr/bin)
Started [19564]
我 运行 在 OSX 上解决了这个问题,这是因为旧版本的 bash 不喜欢 &>> "$log_file" 重定向语法.参见 https://www.gnu.org/software/bash/manual/bashref.html。要恢复到原始 bash 语法更改:
$command &>> "$log_file" &
至:
$command >> "$log_file" 2>&1
我注意到原始语法在脚本的其他地方使用,我会建议 Spring 引导人员在他们的根脚本中进行更改。
在那之前,我建议复制脚本,进行上述编辑,保存新脚本并将其用作 embeddedLanchScript - 如果使用 mvn,则这样做:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable
<embeddedLaunchScript>${basedir}/src/main/resources/embeddedLaunchScript.bash</embeddedLaunchScript>
</configuration>
</plugin>