我正在尝试从此命令中捕获进程号
ps ax | grep catalina
到tcsh shell中的变量。
到目前为止,我可以使用此脚本将进程号回显到屏幕:
set pnum = `ps ax | grep catalina`
echo $pnum | cut -d' ' -f1
但是,当我尝试这样做以获得grep
和cut
set pnum = `ps ax | grep catalina | cut -d' ' -f1`
结果是一个空字符串。
这个序列
set pnum = `ps ax | grep catalina`
set pnum = `$pnum | cut -d' ' -f1`
生成1104: Command not found.
错误。
我错过了什么?
答案 0 :(得分:0)
你需要进一步解构你的过程(也许你有)。要了解您的问题,请先查看ps ax | grep catalina
显示的内容,然后添加set pnum =..
内容。
是的,您应该能够将其链接到一个管道中,但请注意,如果/当输出开头有空格时,您必须增加-f1
以计算每个空间,因此4位PID将比6位PID需要更多-f**n**
。
另请注意,要删除将出现的grep
行,请使用
| grep '[c]atalina'
最后,想一想您的错误消息1104: Command not found.
告诉您的内容。
这是您在第二行前面的$pnum
生成的processID。再次,养成解构失败代码的习惯,可以很容易地看出问题所在。您还可以使用#!/bin/tcsh -vx
打开shell调试跟踪作为脚本的she-bang行。
可能更好的解决方案是使用
set pnum = `ps ax | awk '/[c]atalina/{sub(/^ */,"", $0);print $1}'`
我的csh / tcsh环境正在进行中,所以只进行了轻微的测试。
IHTH。
答案 1 :(得分:0)
尝试pgrep:
set npid = `pgrep -n nginx`
echo $npid
-n
是获得最新的(最近开始的)流程
这也有效(你正在使用的方法):
set pnum = `ps ax | grep nginx | cut -d ' ' -f1`
可能发生的事情是你的进程没有运行,或者在行的开头有一些额外的空格,也可能你必须做这样的事情:
set pnum = `ps ax | grep nginx | grep -v grep | cut -d ' ' -f3`
或者使用awk:
set pnum = `ps ax | awk '/nginx/{print $1}'`