lazybox: support sysstat tools

pull/140/head
cfig 1 year ago
parent 62862a263b
commit d3b28f664c

@ -1,6 +1,7 @@
package cfig.lazybox
import cfig.lazybox.sysinfo.CpuInfo
import cfig.lazybox.sysinfo.Pidstat
import cfig.lazybox.sysinfo.SysInfo
import com.fasterxml.jackson.databind.ObjectMapper
import org.slf4j.LoggerFactory
@ -15,7 +16,7 @@ fun main(args: Array<String>) {
println("Usage: args: (Array<String>) ...")
println(" or: function [arguments]...")
println("\nCurrently defined functions:")
println("\tcpuinfo sysinfo")
println("\tcpuinfo sysinfo sysstat pidstat")
exitProcess(0)
}
if (args.get(0) == "cpuinfo") {
@ -30,4 +31,10 @@ fun main(args: Array<String>) {
if (args.get(0) == "sysinfo") {
SysInfo().run()
}
if (args.get(0) == "sysstat") {
println("adb shell /data/vendor/sadc -F -L -S ALL 2 20 /data/vendor")
}
if (args.get(0) == "pidstat") {
Pidstat.run()
}
}

@ -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…
Cancel
Save