我有一个 .sh 脚本,可以启动我的 java 服务(这个脚本不是我写的)。
有人能解释一下这实际上是如何执行的吗?
start() {
..
..
# setup classpath
. $ROOT/bin/_cp.sh
RUN="java -Dlog.root=$VAR $JOPTS $CP $MAIN -v"
# start
$RUN 2>>$OUT_FILE >>$OUT_FILE &
}
当调用 start 时,它会为选项和类路径(java 内容)构建变量集,但是这一行什么时候执行呢?
$RUN 2>>$OUT_FILE >>$OUT_FILE &
$RUN 是内置的东西吗?
我想将其转换为 upstart 脚本,upstart 要求我使用exec
如下方式:
script
[ "$enabled" = "1" ] || [ "$force_start" = "1" ] || exit 0
# Setup Serviio specific properties
JAVA_OPTS="-Djava.net.preferIPv4Stack=true -Djava.awt.headless=true -Dderby.system.home=$SERVIIO_HOME/library -Dserviio.home=$SERVIIO_HOME -Xmx512M -Xms20M -XX:+UseParNewGC -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=20"
# construct classpath
cd $SERVIIO_HOME
CLASSPATH="config"
for i in lib/*.jar; do
CLASSPATH="$CLASSPATH:$i"
done
# write to syslog - for debugging
# logger -t $0 -- "starting: /usr/bin/java $JAVA_OPTS -classpath $CLASSPATH org.serviio.MediaServer"
exec /usr/bin/java $JAVA_OPTS -classpath $CLASSPATH org.serviio.MediaServer
end script
答案1
正如 Seth 提到的,$RUN 先前在脚本中用该行定义RUN="java ..."
。执行该行,并将标准输出和标准错误消息都附加到该行,该$OUTFILE
行可能也在脚本中定义(或由命令行参数指定)。
2>>file
是用于重定向 stderr 流的 bash 代码。默认情况下,stdout 和 stderr 都输出到 tty(您的 bash 提示符),它们在那里显示,但您可以重定向输出。默认情况下,使用>> file
只会重定向标准输出(使用打印的内容echo
- 这是大多数程序的常用输出形式。但是,当程序希望输出错误时,这将进入标准错误输出流,默认情况下,该流将打印到终端,而不是使用 重定向>>
。要重定向错误流(可能用于错误记录),您可以使用2>> file
,它会将其附加到file
。有趣的是,使用 可以实现与脚本中相同的效果&>> $OUTFILE
,这是“重定向 stdout 和 stderr”的简写。