lazybox: support sysstat tools
parent
62862a263b
commit
d3b28f664c
@ -0,0 +1,85 @@
|
||||
package cfig.lazybox.sysinfo
|
||||
|
||||
import cfig.helper.Helper.Companion.deleteIfExists
|
||||
import com.fasterxml.jackson.databind.ObjectMapper
|
||||
import org.slf4j.LoggerFactory
|
||||
import java.io.File
|
||||
import java.nio.file.Files
|
||||
import java.nio.file.attribute.FileAttribute
|
||||
import java.nio.file.attribute.PosixFilePermissions
|
||||
import kotlin.io.path.Path
|
||||
|
||||
class Pidstat {
|
||||
data class Cfg(
|
||||
var pid: Long? = null,
|
||||
var pidof: String? = null,
|
||||
var pidstat_cmd_pattern: String? = "pservice",
|
||||
var show_thread: Boolean = true,
|
||||
var interval: Int = 3,
|
||||
var iteration: Int? = null,
|
||||
var top_sort_by: Int = 9
|
||||
)
|
||||
companion object {
|
||||
private val log = LoggerFactory.getLogger(Cfg::class.java)
|
||||
fun run() {
|
||||
val outFile = "run%d.sh"
|
||||
File(/* pathname = */ "pid.json").let { pidf ->
|
||||
if (!pidf.exists()) {
|
||||
ObjectMapper().writerWithDefaultPrettyPrinter().writeValue(pidf, Pidstat.Cfg())
|
||||
log.info(pidf.name + " is ready")
|
||||
} else {
|
||||
val cfg = ObjectMapper().readValue(pidf, Pidstat.Cfg::class.java) as Pidstat.Cfg
|
||||
var run1 = true
|
||||
var run2 = true
|
||||
//pid
|
||||
val cmd_pid: String
|
||||
if (cfg.pid != null) {
|
||||
cmd_pid = "-p ${cfg.pid}"
|
||||
log.info("pid found")
|
||||
} else if (cfg.pidof?.isNotBlank() == true) {
|
||||
cmd_pid = "-p \\$\\(pidof\\ ${cfg.pidof}\\)"
|
||||
log.info("pidof found")
|
||||
} else if (cfg.pidstat_cmd_pattern?.isNotBlank() == true) {
|
||||
cmd_pid = "-G ${cfg.pidstat_cmd_pattern}"
|
||||
run2 = false
|
||||
} else {
|
||||
throw IllegalArgumentException("no pid to stat")
|
||||
}
|
||||
//interval
|
||||
val cmd_interval = cfg.interval.toString()
|
||||
//iteration
|
||||
val cmd_iteration1 = if (cfg.iteration != null) cfg.iteration else ""
|
||||
val cmd_iteration2 = if (cfg.iteration != null) "-n ${cfg.iteration}" else ""
|
||||
//thread
|
||||
val cmd_thread1 = if (cfg.show_thread) "-t" else ""
|
||||
val cmd_thread2 = if (cfg.show_thread) "-H" else ""
|
||||
//sort
|
||||
val cmd_sort2 = "-s ${cfg.top_sort_by}"
|
||||
|
||||
val cmd1 = "adb shell /data/vendor/pidstat $cmd_pid -u $cmd_thread1 -l $cmd_interval $cmd_iteration1"
|
||||
val cmd2 = "adb shell top $cmd_thread2 $cmd_pid $cmd_iteration2 $cmd_sort2"
|
||||
|
||||
val ownerWritable = PosixFilePermissions.fromString("rwxr-xr-x")
|
||||
val permissions: FileAttribute<*> = PosixFilePermissions.asFileAttribute(ownerWritable)
|
||||
|
||||
String.format(outFile, 1).let {
|
||||
it.deleteIfExists()
|
||||
Files.createFile(Path(it), permissions)
|
||||
File(it).writeText("#!/bin/bash\nset -x\n$cmd1\n")
|
||||
log.info("$it is ready")
|
||||
}
|
||||
String.format(outFile, 2).let {
|
||||
it.deleteIfExists()
|
||||
if (run2) {
|
||||
Files.createFile(Path(it), permissions)
|
||||
File(it).writeText("#!/bin/bash\necho $cmd2\n$cmd2\n")
|
||||
log.info("$it is ready")
|
||||
} else {
|
||||
log.warn("$it not feasible")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue