在开发环境下,我们经常需要部署代码,重启服务,所以会把命令写在脚本中,方便使用。
我们可能这么写
#!/bin/bash
ps -ef | grep backend-api-1.0 | grep -v "\-\-color" |awk '{print $2}' |xargs kill -9
sleep 1
nohup java -jar backend-api-1.0.jar >> backend-api.log 2>&1 &
tail -f backend-api.log
这个脚本看似没问题,可执行时,会出现kill: 向 PID 发送信号失败: 没有那个进程
的错误,但是服务仍然能正常重启,也就是ps -ef | grep backend-api-1.0 | grep -v "\-\-color"
这个命令并没有把当前执行进程过滤掉。
正确写法是:取项目名中的两个不同的单词,用两次grep
,而不是用grep -v
,如下
#!/bin/bash
ps -ef | grep backend | grep api |awk '{print $2}' |xargs kill -9
sleep 1
nohup java -jar backend-api-1.0.jar >> backend-api.log 2>&1 &
tail -f backend-api.log