我试图找出一个进程是否正在运行,如果它正在运行,那么我想调用一个脚本或打印一些东西。我尝试了以下几种方法,但它给了我语法错误或找不到命令错误。
APP_ID = ps -eaf | grep -i `whoami` | grep -i <process_name> | grep -i java | awk '{print$2}'
if[''!= '${APP_ID}'] then
echo "Stopping instance $APP_ID"
Run Code Online (Sandbox Code Playgroud)
我得到的结果如下:
test.sh: line 15: APP_ID: command not found
test.sh: line 17: if[!= ${APP_ID}]: command not found
Stopping instance
Run Code Online (Sandbox Code Playgroud)
上面的脚本有什么问题?如果它有一些错误,那么为什么它会echo在if条件中打印?
下面的脚本也没有说 test.sh: line 3: [ps: command not found
if [ps -eaf | grep -i `whoami` | grep -i <process_name> | grep -i java]; then
echo 'stop'
fi
Run Code Online (Sandbox Code Playgroud)
Pet*_*ter 10
设置变量时删除“=”周围的空格
错误的:
APP_ID = value
Run Code Online (Sandbox Code Playgroud)
对:
APP_ID=value
Run Code Online (Sandbox Code Playgroud)要运行程序并将其输出放入变量中,您需要$(...)(在 bash 中首选,在 sh 中不可用)或反引号`command`(在 bash 和 sh 中支持)。(请记住分配变量时,不需要引号,但在其他情况下,他们是很重要的:command "$(command)")
错误的:
APP_ID=command
Run Code Online (Sandbox Code Playgroud)
对:
APP_ID=$(command)
Run Code Online (Sandbox Code Playgroud)使用“[”时在所有内容周围添加空格,并且在“]”之后需要一个分号或换行符。这是因为 "[" 是 bash 内置命令,非内置命令也称为 "test"(请参阅man test),它就像其他命令一样,使用空格分隔其参数:
错误的:
if[x!= y] then echo hello world fi
Run Code Online (Sandbox Code Playgroud)
对:
if [ x != y ]; then echo hello world; fi
Run Code Online (Sandbox Code Playgroud)当你想扩展一个变量时使用双引号,而不是单引号
错误的:
if [ '' != '${APP_ID}' ]; then
Run Code Online (Sandbox Code Playgroud)
对:
if [ '' != "${APP_ID}" ]; then
Run Code Online (Sandbox Code Playgroud)同样对于上面的示例,您可以使用 -n(非空)而不是与空字符串进行比较
if [ -n "${APP_ID}" ]; then
Run Code Online (Sandbox Code Playgroud)对于 ps 示例,您不需要 grep 和 awk:
APP_ID=$(ps -C whoami --no-header --format 'pid')
Run Code Online (Sandbox Code Playgroud)APP_ID=$(ps -C whoami --no-header --format 'pid')
if [ -n "${APP_ID}" ]; then
echo "Stopping instance $APP_ID"
fi
Run Code Online (Sandbox Code Playgroud)
pgrep使用and可以最简单地完成此操作pkill:
if pgrep process_name 2>/dev/null; then
echo "Terminating process_name"
pkill process_name
fi
Run Code Online (Sandbox Code Playgroud)
process_name 正如用户 @OrangeDog 在评论中指出的那样,如果进程在调用pgrep和pkill之间产生,则该 shell 代码理论上有可能无法终止进程。在这种情况下,pgrep将不会检测到该进程并且pkill永远不会执行。这个问题有多大,我不知道。如果该进程在语句之后立即生成,您能做什么?
做就是了
echo "terminating process_name (if it is running)"
pkill process_name
Run Code Online (Sandbox Code Playgroud)
无论如何都要摆脱讨厌的竞争条件。