diff --git a/azkaban-common/src/main/java/azkaban/Constants.java b/azkaban-common/src/main/java/azkaban/Constants.java
index 7aba594..246e65a 100644
--- a/azkaban-common/src/main/java/azkaban/Constants.java
+++ b/azkaban-common/src/main/java/azkaban/Constants.java
@@ -54,6 +54,7 @@ public class Constants {
public static class ConfigurationKeys {
// These properties are configurable through azkaban.properties
+ public static final String AZKABAN_PID_FILENAME = "azkaban.pid.filename";
// Defines a list of external links, each referred to as a topic
public static final String AZKABAN_SERVER_EXTERNAL_TOPICS = "azkaban.server.external.topics";
diff --git a/azkaban-web-server/src/main/java/azkaban/webapp/Status.java b/azkaban-web-server/src/main/java/azkaban/webapp/Status.java
index c2ffeed..a0e5769 100644
--- a/azkaban-web-server/src/main/java/azkaban/webapp/Status.java
+++ b/azkaban-web-server/src/main/java/azkaban/webapp/Status.java
@@ -29,18 +29,21 @@ import java.util.Map;
public class Status {
private final String version;
+ private final String pid;
private final String installationPath;
private final long usedMemory, xmx;
private final boolean isDatabaseUp;
private final Map<Integer, Executor> executorStatusMap;
Status(final String version,
+ final String pid,
final String installationPath,
final long usedMemory,
final long xmx,
final boolean isDatabaseUp,
final Map<Integer, Executor> executorStatusMap) {
this.version = version;
+ this.pid = pid;
this.installationPath = installationPath;
this.usedMemory = usedMemory;
this.xmx = xmx;
diff --git a/azkaban-web-server/src/main/java/azkaban/webapp/StatusService.java b/azkaban-web-server/src/main/java/azkaban/webapp/StatusService.java
index 8472fb9..b44d029 100644
--- a/azkaban-web-server/src/main/java/azkaban/webapp/StatusService.java
+++ b/azkaban-web-server/src/main/java/azkaban/webapp/StatusService.java
@@ -19,14 +19,18 @@ package azkaban.webapp;
import static azkaban.webapp.servlet.AbstractAzkabanServlet.jarVersion;
+import azkaban.Constants.ConfigurationKeys;
import azkaban.db.DatabaseOperator;
import azkaban.executor.Executor;
import azkaban.executor.ExecutorLoader;
import azkaban.executor.ExecutorManagerException;
+import azkaban.utils.Props;
+import com.google.common.io.Files;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import java.io.File;
import java.io.IOException;
+import java.nio.charset.StandardCharsets;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
@@ -40,14 +44,16 @@ public class StatusService {
private static final Logger log = LoggerFactory.getLogger(StatusService.class);
private static final File PACKAGE_JAR = new File(
StatusService.class.getProtectionDomain().getCodeSource().getLocation().getPath());
-
private final ExecutorLoader executorLoader;
private final DatabaseOperator dbOperator;
+ private final String pidFilename;
@Inject
- public StatusService(final ExecutorLoader executorLoader, final DatabaseOperator dbOperator) {
+ public StatusService(final Props props, final ExecutorLoader executorLoader,
+ final DatabaseOperator dbOperator) {
this.executorLoader = executorLoader;
this.dbOperator = dbOperator;
+ this.pidFilename = props.getString(ConfigurationKeys.AZKABAN_PID_FILENAME, "currentpid");
}
private static String getInstallationPath() {
@@ -66,6 +72,7 @@ public class StatusService {
// Build the status object
return new Status(version,
+ getPid(),
getInstallationPath(),
usedMemory,
runtime.maxMemory(),
@@ -73,6 +80,18 @@ public class StatusService {
getActiveExecutors());
}
+ private String getPid() {
+ final File libDir = PACKAGE_JAR.getParentFile();
+ final File installDir = libDir.getParentFile();
+ final File pidFile = new File(installDir, this.pidFilename);
+ try {
+ return Files.readFirstLine(pidFile, StandardCharsets.UTF_8).trim();
+ } catch (final IOException e) {
+ log.error("Unable to obtain PID", e);
+ return "unknown";
+ }
+ }
+
private Map<Integer, Executor> getActiveExecutors() {
final Map<Integer, Executor> executorMap = new HashMap<>();
try {