![systemd.unit 中带有 %p 的 jvm 选项 -Xloggc 给出了错误的日志文件名](https://linux22.com/image/142713/systemd.unit%20%E4%B8%AD%E5%B8%A6%E6%9C%89%20%25p%20%E7%9A%84%20jvm%20%E9%80%89%E9%A1%B9%20-Xloggc%20%E7%BB%99%E5%87%BA%E4%BA%86%E9%94%99%E8%AF%AF%E7%9A%84%E6%97%A5%E5%BF%97%E6%96%87%E4%BB%B6%E5%90%8D%20.png)
我有一个 java 进程,我想使用以下选项运行它:
-Xloggc:/var/log/mylog_%p.gc.log
以便日志文件的名称包含 PID。例如,如果进程的 PID 为 3498,则日志文件名称为/var/log/mylog_pid3498.gc.log
.我希望 Java 进程由系统单元文件。单元文件为:
[Service]
User=ubuntu
Type=simple
WorkingDirectory=/home/ubuntu/my_code
ExecStart=/usr/bin/java -Xloggc:/var/log/mylog_%%p.gc.log -jar my_code.jar
Restart=always
请注意,我使用了该%%
字符来转义%
.然而,这并没有给出预期的结果,因为我知道日志文件有 name /var/log/mylog_%p.gc.log
,即 Java 无法%p
用实际的 PID 进行替换。
任何想法?谢谢!
操作系统:
Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-1066-aws x86_64)
Java版本:
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
系统版本:
systemd 229
+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ -LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD -IDN
更新
systemctl show -p ExecStart --no-pager my_service
ExecStart={ path=/usr/bin/java ; argv[]=/usr/bin/java -Xloggc:/var/log/mylog_%%p.gc.log -jar my_code.jar ; ignore_errors=no ; start_time=[Tue 2018-11-27 17:08:43 UTC] ; stop_time=[n/a] ; pid=1664 ; code=(null) ; status=0/0 }