【问题标题】:How to find the command line of a process only if the process is from current user仅当进程来自当前用户时如何查找进程的命令行
【发布时间】:2013-09-26 08:00:21
【问题描述】:

我有以下情况: perl 脚本读取应用程序写入的文件pid,并试图杀死它。 但问题是我不想杀死另一个进程,所以我检查具有记录 PID 的当前进程是否具有相同的命令行。如果是这样,应用程序可能会被终止。

以下 blues 脚本找出 cmdline:

$PIDCMDLINE = `ps -p $PID -o cmd`;

问题是,如果另一个用户的另一个实例启动,可能在同一个 sid 上,它将被杀死,因为它将返回一个有效的命令行,我不希望这种行为。

如何限制 ps -p 只搜索当前用户进程(不,简单的ps 不算,因为-p nullify ps 的默认效果)

谢谢!

【问题讨论】:

  • 如果你不是root,你不能杀死其他用户的进程。
  • 如果您在 Linux 或其他系统上使用 /proc,那么您可以只检查 /proc/$PID 的 uid。

标签: perl bash process pid ps


【解决方案1】:

您可以使用以下命令检查特定 PID 的命令和用户:

ps -p <PID> -o user,cmd --columns 1000 | grep `whoami`

根据评论添加“grep”。

【讨论】:

  • 我可以告诉 ps 我只对当前用户感兴趣,而不是先找到它然后将其传递给 ps 吗?否则,很好的答案。谢谢。
  • 你可以添加一个简单的 grep: ps -p -o user,cmd --columns 1000 | grep whoami
  • @imapollo 与其使用管道连接到grep 输出,不如说:ps -u $(whoami) -p &lt;PID&gt; -o cmd
  • :( 在这种情况下 -p 被忽略并显示当前用户的所有命令行。
【解决方案2】:

可能有点尴尬,但是这样呢:

$PIDCMDLINE = ps -p $PID -o user,command | grep `whoami` | awk '{ print $2 }'

【讨论】:

  • 对于查找命令行的简单目的来说有点太复杂了。还创建了 3 个新流程,我无法承受这种奢侈。
  • @nucandrei 是的,添加 awk 比在主脚本中拆分 user command 输出更昂贵。
猜你喜欢
  • 2010-10-10
  • 2013-02-13
  • 1970-01-01
  • 2010-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多