【问题标题】:Building an "odometer" for time spent on a server为在服务器上花费的时间构建一个“里程表”
【发布时间】:2011-11-05 22:30:12
【问题描述】:

我想构建一个里程表,以跟踪自上次重置计数器以来我在服务器上的时间。

最近,我在学校的一台 unix 服务器上工作了相当多的时间,并开始想知道过去几天我花了多少时间。我开始尝试考虑如何编写 Bash 脚本或 C 程序以在我的 .bash_profile 加载时运行(即当我 ssh 进入服务器时)、后台本身以及当我将时间保存到文件时关闭会话。

我知道如何让程序在我登录时运行(通过 .bash_profile)以及如何使 C 程序后台运行(通过分叉?),但我不确定如何检测 ssh 会话已终止(也许通过观察 sshd 进程?) 我希望这是正确的堆栈交换来询问您将如何处理这样的事情并感谢任何输入。

【问题讨论】:

  • last 命令[linux.die.net/man/1/last]
  • 您可以考虑使用 .bash_history 的修改时间来确定您上次结束 bash 会话的时间。如果您一次启动多个 shell,这将变得更加复杂。
  • 一次运行多个 shell 是我会遇到的问题。
  • 谢谢@F.C.对于last 命令,我不知道那个!

标签: c bash unix timer


【解决方案1】:

根据您的 shell,您可以在登录时在后台生成一个进程,然后在父进程(shell)退出时处理 kill 信号。它不会消耗资源,您也不需要 root 权限,而且它应该会提供相当准确的登录时间报告。

您可能需要使用 POSIX 信号量来处理多个 shell 同时登录的情况。

【讨论】:

  • 谢谢,你知道关闭sshd进程时会发送什么样的信号吗?它只是向所有孩子发送 SIGHUP 吗?没想过使用信号量,但我喜欢这种方法。
  • 我相信这是正确的。您可能想尝试捕获不同的信号以查看发送了哪些信号。
【解决方案2】:

您是否考虑过编写一个可以由 cron 每分钟运行一次的脚本,运行“who”,查看其输出中包含您的 uid 的行,并在发现任何行时碰撞计数器? (使用“crontab -e”来编辑你的 crontab。)

即使只是像这样在 crontab 中的一行:

* * * * * (date; who | grep $LOGNAME)>>$HOME/.whodata

...将创建一个日志,您可以稍后在空闲时进行处理。

【讨论】:

  • 我对 cron 不是很熟悉,但我会研究一下。理想情况下,我希望创建仅在我登录时运行的东西(即,它不会在我未登录时检查我是否已登录)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多