From 140e45bc021d6c868a366a11f667b026b74607d3 Mon Sep 17 00:00:00 2001 From: dvs1 Date: Thu, 3 Oct 2024 17:29:25 +1000 Subject: First commit. --- jackoffall | 146 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100755 jackoffall (limited to 'jackoffall') diff --git a/jackoffall b/jackoffall new file mode 100755 index 0000000..6c7cec2 --- /dev/null +++ b/jackoffall @@ -0,0 +1,146 @@ +#!/usr/bin/env luajit + + +local APT = {} + + +APT.readCmd = function(cmd) + local result = {} + local output = io.popen(cmd) + if nil ~= output then + for l in output:lines() do + table.insert(result, l) + end + end + return result +end + + +APT.exe = function(c) + local exe = {status = 0, result = '', log = true, cmd = c .. ' ', command = c} + + function exe:log() + self.log = true + return self + end + function exe:Nice(c) + if nil == c then + self.cmd = 'ionice -c3 nice -n 19 ' .. self.cmd + else + self.cmd = self.cmd .. 'ionice -c3 nice -n 19 ' .. c .. ' ' + end + return self + end + function exe:timeout(c) + -- timeout returns a status of - command status if --preserve-status; "128+9" (actually 137) if --kill-after ends up being done; 124 if it had to TERM; command status if all went well. + -- --kill-after means "send KILL after TERM fails. + if nil == c then + self.cmd = 'timeout --kill-after=10.0 --foreground 42.0s ' .. self.cmd + else + self.cmd = 'timeout --kill-after=10.0 --foreground ' .. c .. ' ' .. self.cmd + end + return self + end + function exe:also(c) + if nil == c then c = '' else c = ' ' .. c end + self.cmd = self.cmd .. ';' .. c .. ' ' + return self + end + function exe:And(c) + if nil == c then c = '' else c = ' ' .. c end + self.cmd = self.cmd .. '&&' .. c .. ' ' + return self + end + function exe:Or(c) + if nil == c then c = '' end + self.cmd = self.cmd .. '|| ' .. c .. ' ' + return self + end + function exe:noErr() + self.cmd = self.cmd .. '2>/dev/null ' + return self + end + function exe:wait(w) + self.cmd = self.cmd .. '&& touch ' .. w .. ' ' + return self + end + function exe:Do() + --[[ "The condition expression of a control structure can return any + value. Both false and nil are considered false. All values different + from nil and false are considered true (in particular, the number 0 + and the empty string are also true)." + says the docs, I beg to differ.]] + if true == self.log then D(" executing -   " .. self.cmd .. "") end + --[[ Damn os.execute() + Lua 5.1 says it returns "a status code, which is system-dependent" + Lua 5.2 says it returns true/nil, "exit"/"signal", the status code. + I'm getting 7168 or 0. No idea what the fuck that is. + local ok, rslt, status = os.execute(s) + ]] + local f = APT.readCmd(self.cmd, 'r') + -- The last line will be the command's returned status, collect everything else in result. + self.status = '' -- Otherwise the result starts with 0. + self.result = '\n' + for i,l in ipairs(f) do + self.result = self.result .. l .. "\n" + end + f = APT.readCmd('echo "$?"', 'r') + for i,l in ipairs(f) do + self.status = tonumber(l) + if (137 == self.status) or (124 == self.status) then + print("timeout killed " .. self.status .. ' ' .. self.command) + E("timeout killed " .. self.status .. ' ' .. self.command) + elseif (0 ~= self.status) then + print("status |" .. self.status .. '| ' .. self.command) + E("status |" .. self.status .. '| ' .. self.command) + end + end + return self + end + function exe:fork(host) + if nil ~= host then self.cmd = self.cmd .. '; r=$?; if [ $r -ge 124 ]; then echo "$r ' .. host .. ' failed forked command ' .. string.gsub(self.cmd, '"', "'") .. '"; fi' end + self.cmd = '{ ' .. self.cmd .. '; } &' + if true == self.log then D(" forking -   " .. self.cmd .. "") end + os.execute(self.cmd) + return self + end + return exe +end + + +APT.exe("a2j_control --stop"):Do() +APT.exe("sleep 2"):Do() +APT.exe("a2j_control --exit"):Do() +APT.exe("sleep 2"):Do() +APT.exe("killall -TERM alsa_out"):Do() +APT.exe("killall -TERM alsa_in"):Do() +APT.exe("killall -TERM zita-a2j"):Do() +APT.exe("killall -TERM zita-j2a"):Do() +APT.exe("killall -TERM aseqjoy"):Do() +APT.exe("killall -TERM jack-plumbing"):Do() +APT.exe("sleep 2"):Do() +APT.exe("jack_control stop"):Do() +APT.exe("sleep 2"):Do() +APT.exe("jack_control exit"):Do() +APT.exe("sleep 2"):Do() +--APT.exe("a2j_control --stop; a2j_control --exit"):Do() +--APT.exe("sleep 2"):Do() +APT.exe("killall -TERM jmcore"):Do() +APT.exe("pkill -TERM jackdbus; pkill -TERM a2jmidid"):Do() +APT.exe("killall -TERM a2jmidid"):Do() +APT.exe("killall -KILL jackdbus"):Do() +APT.exe("sleep 2"):Do() +APT.exe("killall -KILL a2jmidid"):Do() +APT.exe("pkill -KILL jackdbus; pkill -KILL a2jmidid"):Do() +APT.exe("sleep 2"):Do() +APT.exe("killall -KILL a2jmidid"):Do() +APT.exe("killall -KILL jackdbus"):Do() +APT.exe("sleep 2"):Do() +APT.exe("killall -KILL a2jmidid"):Do() +APT.exe("killall -KILL jackdbus"):Do() +APT.exe("sleep 2"):Do() +APT.exe("pkill -KILL jackdbus; pkill -KILL a2jmidid"):Do() +APT.exe("killall -TERM qjackctl"):Do() + +-- Catia is python, and no easy way to kill it. +APT.exe("ps auxw | grep python"):Do() -- cgit v1.1