# 61.2.3 自定义启动脚本

Maven或Gradle插件生成的默认内嵌启动脚本可以通过很多方法自定义，对于大多数开发者，使用默认脚本和一些自定义通常就足够了。如果发现不能自定义需要的东西，你可以使用`embeddedLaunchScript`选项生成自己的文件。

**在脚本生成时自定义**

自定义写入jar文件的启动脚本元素是有意义的。例如，为`init.d`脚本提供“description”，既然知道这会展示到前端（并且，它不需改变），你可能会在生成jar时提供它。

为了自定义写入的元素，你需要为Spring Boot Maven或Gradle插件指定`embeddedLaunchScriptProperties`选项。

以下是默认脚本支持的可代替属性：

| 名称                         | 描述                                                                                                                           |
| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| `mode`                     | 脚本模式，默认为`auto`                                                                                                               |
| `initInfoProvides`         | 'INIT INFO'部分的`Provides`，对于Gradle默认为`spring-boot-application`，对于Maven默认为`${project.artifactId}`                              |
| `initInfoRequiredStart`    | 'INIT INFO'部分的`Required-Start`，默认为`$remote_fs $syslog $network`                                                              |
| `initInfoRequiredStop`     | 'INIT INFO'部分的`Required-Stop`，默认为`$remote_fs $syslog $network`                                                               |
| `initInfoDefaultStart`     | 'INIT INFO'部分的`Default-Start`，默认为`2 3 4 5`                                                                                   |
| `initInfoDefaultStop`      | 'INIT INFO'部分的`Default-Stop`，默认为`0 1 6`                                                                                      |
| `initInfoShortDescription` | ‘INIT INFO’部分的`Short-Description`，对于Gradle默认为`Spring Boot Application`，对于Maven默认为`${project.name}`                           |
| `initInfoDescription`      | “INIT INFO”部分的`Description`，对于Gradle默认为`Spring Boot Application`，对于Maven默认为`${project.description}`（失败会回退到`${project.name}`） |
| `initInfoChkconfig`        | “INIT INFO”部分的`chkconfig`，默认为`2345 99 01`                                                                                    |
| `confFolder`               | `CONF_FOLDER`的默认值，默认为包含jar的文件夹                                                                                               |
| `inlinedConfScript`        | 对应该内联到默认启动脚本中的文件脚本的引用。这可以用来在加载任何外部配置文件之前设置环境变量，比如`JAVA_OPTS`                                                                 |
| `logFolder`                | `LOG_FOLDER`的默认值，只对`init.d`服务有效                                                                                              |
| `logFilename`              | `LOG_FILENAME`的默认值，只对`init.d`服务有效                                                                                            |
| `pidFolder`                | `PID_FOLDER`的默认值，只对`init.d`服务有效                                                                                              |
| `pidFilename`              | `PID_FOLDER`里pid文件名的默认值，只对`init.d`服务有效                                                                                       |
| `useStartStopDaemon`       | 如果`start-stop-daemon`命令可用，它会控制该实例，默认为`true`                                                                                  |
| `stopWaitTime`             | `STOP_WAIT_TIME`的默认值，只对`init.d`服务有效。默认到60秒                                                                                   |

**在脚本运行时自定义**

对于需要在jar文件生成后自定义的项目，你可以使用环境变量或配置文件。

默认脚本支持以下环境变量：

| 变量                      | 描述                                                                                                       |       |        |                                           |
| ----------------------- | -------------------------------------------------------------------------------------------------------- | ----- | ------ | ----------------------------------------- |
| `MODE`                  | 操作的模式，默认值依赖于jar构建方式，通常为`auto`（意味着它会尝试通过检查它是否为`init.d`目录的软连接来推断这是不是一个init脚本）。你可以显式将它设置为`service`，这样\`stop | start | status | restart`命令就可以工作了，或如果你只是想在前台运行该脚本那只需`run\` |
| `USE_START_STOP_DAEMON` | 如果`start-stop-daemon`命令可用，它将被用来控制该实例，默认为`true`                                                           |       |        |                                           |
| `PID_FOLDER`            | pid文件夹的根目录（默认为`/var/run`）                                                                                |       |        |                                           |
| `LOG_FOLDER`            | 存放日志文件的文件夹（默认为`/var/log`）                                                                                |       |        |                                           |
| `CONF_FOLDER`           | 读取`.conf`文件的文件夹                                                                                          |       |        |                                           |
| `LOG_FILENAME`          | 存放于`LOG_FOLDER`的日志文件名（默认为`<appname>.log`）                                                                |       |        |                                           |
| `APP_NAME`              | 应用名，如果jar运行自一个软连接，脚本会猜测它的应用名。如果不是软连接，或你想显式设置应用名，这就很有用了                                                   |       |        |                                           |
| `RUN_ARGS`              | 传递给程序的参数（Spring Boot应用）                                                                                  |       |        |                                           |
| `JAVA_HOME`             | 默认使用`PATH`指定`java`的位置，但如果在`$JAVA_HOME/bin/java`有可执行文件，你可以通过该属性显式设置                                       |       |        |                                           |
| `JAVA_OPTS`             | JVM启动时传递的配置项                                                                                             |       |        |                                           |
| `JARFILE`               | 在脚本启动没内嵌其内的jar文件时显式设置jar位置                                                                               |       |        |                                           |
| `DEBUG`                 | 如果shell实例的`-x`标识有设值，则你能轻松看到脚本的处理逻辑                                                                       |       |        |                                           |
| `STOP_WAIT_TIME`        | 强制关闭应用之前的等待时间，单位为秒（默认为`60`秒）                                                                             |       |        |                                           |

**注** `PID_FOLDER`，`LOG_FOLDER`和`LOG_FILENAME`变量只对`init.d`服务有效。对于`systemd`等价的自定义方式是使用‘service’脚本。有关详细信息，请参阅[服务单元配置手册页](https://www.freedesktop.org/software/systemd/man/systemd.service.html)。

如果`JARFILE`和`APP_NAME`出现异常，上面的设置可以使用一个`.conf`文件进行配置。该文件预期是放到跟jar文件临近的地方，并且名字相同，但后缀为`.conf`而不是`.jar`。例如，一个命名为`/var/myapp/myapp.jar`的jar将使用名为`/var/myapp/myapp.conf`的配置文件：

**myapp.conf**

```
JAVA_OPTS=-Xmx1024M
LOG_FOLDER=/custom/log/folder
```

**注** 如果不喜欢配置文件放到jar附近，你可以使用`CONF_FOLDER`环境变量指定文件的位置。

想要学习如何正确的保护文件可以参考[the guidelines for securing an init.d service.](https://docs.spring.io/spring-boot/docs/2.0.0.RELEASE/reference/htmlsingle/#deployment-initd-service-securing)。
