-1

有一个启动服务的命令, su -s /bin/bash nuance -c '$JAVA_HOME/bin/java -Dlog4j.configurationFile=$NLPS_HOME/config/log4j2.xml -jar $NLPS_HOME/lib/nlps.jar --spring.config.location=$NLPS_HOME/config/,$NUANCE_DATA_DIR/system/config/User-nlps01.properties watcher.RestartOnFailure=FALSE watcher.SendAlarmsToWatcher=FALSE > /dev/null 2>&1 &'我希望这个命令在我的 rhel 7 linux 启动时运行。于是我尝试了crontab,也就是@reboot sh /execute/nlp.sh

但它不起作用,我不知道为什么。请告诉我我做错了什么我被困在 nlp.sh 里面:

#!/bin/bash
/bin/su -s /bin/bash nuance -c '$JAVA_HOME/bin/java -Dlog4j.configurationFile=$NLPS_HOME/config/log4j2.xml -jar $NLPS_HOME/lib/nlps.jar --spring.config.location=$NLPS_HOME/config/,$NUANCE_DATA_DIR/system/config/User-nlps01.properties  watcher.RestartOnFailure=FALSE watcher.SendAlarmsToWatcher=FALSE > /dev/null 2>&1 &'
4

2 回答 2

1

您需要定义$JAVA_HOME$NLPS_HOME并且$NUANCE_DATA_DIR需要在脚本执行之前定义和导出环境变量。

export JAVA_HOME=/path/to/java/home
export NUANCE_DATA_DIR=/path/to/nuance/dir
export NLPS_HOME=/path/to/npls/home
于 2020-10-07T19:24:43.543 回答
0

您必须使用双引号来插入变量。单引号不会插入任何内容,但双引号会。

/bin/su -s /bin/bash nuance -c "$JAVA_HOME/bin/java -Dlog4j.configurationFile=$NLPS_HOME/config/log4j2.xml -jar $NLPS_HOME/lib/nlps.jar --spring.config.location=$NLPS_HOME/config/,$NUANCE_DATA_DIR/system/config/User-nlps01.properties  watcher.RestartOnFailure=FALSE watcher.SendAlarmsToWatcher=FALSE > /dev/null 2>&1 &"

来自 Bash 手册:

3.1.2.2 单引号

将字符括在单引号 ( ') 中会保留引号内每个字符的文字值。单引号之间不能出现单引号,即使前面有反斜杠。

3.1.2.3 双引号

将字符括在双引号 ( ") 中会保留引号内所有字符的文字值,但$, `, \, 和启用历史扩展时除外!。字符$`在双引号内保留其特殊含义(请参阅Shell Expansions)。反斜杠仅在后跟以下字符之一时才保留其特殊含义:$, `, ",\,或换行符。在双引号内,删除后面跟有这些字符之一的反斜杠。没有特殊含义的字符前面的反斜杠保持不变。双引号可以用反斜杠在双引号中引用。如果启用,将执行历史扩展,除非!出现在双引号中的使用反斜杠进行转义。前面的反斜杠!不会被删除。

双引号中的特殊参数*@具有特殊含义(请参阅Shell 参数扩展)。

于 2020-10-07T19:52:44.237 回答