所以我有以下Java服务器:Simple Spring Boot jar-50MB
文件位于/home/dashboard/dashboard-server/dashboard.jar
我在/home/dashboard/.config/systemd/user
中有以下我的systemd用户文件。当jar文件被更改时(即touch -m dashboard.jar
),我的应用服务器重新启动,这很好。
这是问题所在……例如,当我使用scp
将jar的新版本传输到服务器时,写入第一个字节后立即触发我的观察者。请注意,jar文件为50MB,上传速度为3MB / s。因此,将jar 100%上传到服务器可能需要一点时间,但我的系统观察者已经重新启动了该服务,由于尚未上传完整的jar,因此该服务将崩溃。
我知道我可以在服务标签中放入ExecStartPre=/bin/sleep {seconds_here}
,但这并不是我要查找的“解决方案”,因为传输速度会有所不同。 systemd是否有可能捕获到“文件的上传/复制/移动已完成”并随后触发监视程序?
还是有其他解决方案?
这是我的3个文件(服务,观察者路径,观察者服务)
# /home/dashboard/.config/systemd/user/dashboard-server.service
[Unit]
Description=Dashboard Server
After=syslog.target network.target
[Service]
WorkingDirectory=/home/dashboard/dashboard-server
ExecStart=/usr/bin/java -jar dashboard.jar --spring.config.location=file:conf/
StandardOutput=null
StandardError=null
SyslogIdentifier=dashboard-server
SuccessExitStatus=143
Restart=always
PrivateTmp=true
NoNewPrivileges=true
[Install]
WantedBy=default.target
# /home/dashboard/.config/systemd/user/dashboard-server-watcher.path
[Path]
PathModified=/home/dashboard/dashboard-server/dashboard.jar
[Install]
WantedBy=default.target
# /home/dashboard/.config/systemd/user/dashboard-server-watcher.service
[Unit]
Description=Dashboard Server Restarter
After=network.target
[Service]
Type=oneshot
ExecStart=/bin/systemctl --user restart dashboard-server.service
[Install]
WantedBy=default.target