如何解决Crontab无法运行Shell
有一个命令来启动一个服务
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 &'
解决方法
您需要定义$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
,
您必须使用双引号对变量进行插值。单引号不会插入任何内容,但双引号可以插入。
/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手册:
将字符括在单引号('
)中可保留引号内每个字符的字面值。即使在单引号前加反斜杠,也不能在单引号之间出现单引号。
用双引号(
"
)引起来的字符保留引号内所有字符的文字值,但$
,`
,\
除外,并且,启用历史记录扩展后,!
。字符$
和`
在双引号中保留其特殊含义(请参见Shell Expansions)。仅当反斜杠后面跟随以下字符之一时,才保留其特殊含义:$
,`
,"
,\
或换行符。在双引号中,将删除反斜杠,后跟这些字符之一。没有特殊含义的反斜杠前面的字符将保持不变。双引号可以在双引号内加上反斜杠。如果启用,将执行历史记录扩展,除非使用反斜杠将出现在双引号中的!
转义。!
前面的反斜杠不会被删除。
特殊参数*
和@
在双引号中具有特殊含义(请参见Shell Parameter Expansion)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。