我有一个旧的方法来杀死闲置的mosh-server进程,这在我的新VPS上不起作用。
这是旧的方法,我在root的crontab中运行,以清理已经闲置10天以上的mosh进程:
for tty in `w -sf | grep -P '\d\ddays mosh-server' | cut -c 10-15`; do kill -9 `ps -o pid= -t $tty`; done
问题是,在新的VPS上,这些进程没有TTY,所以我不能通过TTY匹配并以这种方式杀死mosh。 这是我到目前为止(顺便说一下,新的VPS在Debian上运行内核3.2,旧版本是以前的Debian版本)。
for loginday in `w | grep -P '\d\ddays.* mosh-server' | cut -c 34-40 | sed 's/^\([0-9]*\)\([a-zA-Z]*\).*$/\2 \1/'`; do echo $loginday; done
我正在尝试从'w'获取logindate,并将其与'ps'中的信息相关联:
ps -C mosh-server -o bsdstart
因此,我可以关联login当天启动的任何闲置mosh-server会话(可能是野性中的99.9%),并使用'ps'来获取pid。
然而,'w'输出login日如此:
03Oct13
我简单地把它切成“03Oct”。
这样'ps'输出:
Oct 3
你可以在上面的sed命令中看到,这是不工作的部分,我试图在“03Oct”中输出“Oct 03”(当我得到这个工作时,我会处理零)我不能为我的生活得到sed工作在for循环时,似乎工作,当我用'回声'testing它:
echo 03Oct | sed 's/\([0-9]*\)\([a-zA-Z]*\).*/\2 \1/'
一旦我把它粘贴到for循环中,什么是sed命令?
更好的是, 有没有更好或不太好的方法来做到这一点? 鉴于分离的闲置mosh-server进程在Linux 3.2上没有TTY,我可以很容易地关联? 编辑:此外,在安装了libutempter的系统上, mosh-server会将信息写入utmp ,我怀疑这会有用,但是我不知道如何处理它。
你的echotesting有两个重要的方面不同于你的回路testing:
环路testing不起作用的部分原因是您没有考虑到空白区域。 另一个原因是,你使用*量词这意味着“零或更多”,并有影响,你想要一些数字,但不是真的。 为了解决这个问题,你可以使用“一个或多个”的+量词。 我们将使用它的字母字符。 不过,既然你想消除前面的零,我们可以采取与数字有点不同的方向。
由于GNU sed支持扩展正则expression式,所以我们可以消除所有这些特殊字符和我添加的特殊字符。 但请注意, -r选项不可移植。 另外,我将命名字符类replace为字母字符,使正则expression式更具可读性,并使其与具有不同字符集的语言兼容。
sed -r 's/^ *((0)|([1-9]))([0-9])([[:alpha:]]+).*$/\5 \3\4/'
领先的零被捕获在组2中,正在被丢弃。 组1是两位数字的前导数字。 组2包含零时,组3为空(因为使用pipe道字符创build了replace)。
至于utmp去, last mosh-server输出什么对你有用(与libutempter安装)?
请参阅stream程pipe理 ,看看您是否find有用的东西。