Wrangling sedfind并重新格式化logindate(或者,如何杀死闲置的mosh-server进程)

我有一个旧的方法来杀死闲置的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:

  • date周围没有空白
  • 正则expression式没有锚点

环路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有用的东西。