从bash脚本运行一些命令

时间:2012-08-11 09:24:23

标签: linux bash process

我认为这应该是直截了当的,但结果令我感到困惑。

当我使用命令运行bash脚本时,

sudo ./restartccpd.bash

屏幕上没有任何内容。还有

的问题
sudo /etc/init.d/ccpd status

运行脚本后独立于屏幕产生空,而不是显示守护进程的pid。这证明只有pkill命令正在工作。

脚本的内容是,

#!/bin/bash

sudo pkill -9 ccpd
sudo /etc/init.d/ccpd start
sudo /etc/init.d/ccpd status

从终端运行时,命令工作正常。但是,当作为脚本运行时,如上所述,它没有按预期工作。

我尝试在命令之间插入sleep命令,但没有任何效果。此外,syslog中没有任何内容。所以,我无法诊断问题。

任何建议将不胜感激。

2 个答案:

答案 0 :(得分:6)

pkill会杀死命令名中包含ccpd的任何内容。您的脚本名为restartccpd.bash。第一行是:

pkill ccpd

因此脚本启动,运行pkill(不产生输出)并立即杀死自己。塔达!

最简单的解决方案是重命名脚本。你也可以这样做:

kill $(pgrep -l ccpd | grep -v restartccpd | awk '{print $1}')

这将生成与ccpd匹配的进程名称和pid列表,然后从列表中删除restartccpd,然后使用kill终止进程。

答案 1 :(得分:0)

作为larsks correctly diagnosedpkill ccpd会终止名称中包含ccpd的所有进程。包括你的剧本。

立即修复是将-x选项传递给pkill,以便它只匹配名称正好为ccpd的进程。

请注意,如果您的脚本包含sudo命令,则不需要使用sudo调用它。或者,您可以从脚本中删除所有sudo来电,并使用sudo进行调用。

但是,您不应该运行此脚本。您通常应该调用init脚本来关闭服务:/etc/init.d/ccpd stop。除了杀死守护进程之外,这还可以执行其他必要的清理,例如删除临时文件和锁。应该使用kill -9的唯一情况是,如果出现严重错误,导致/etc/init.d/ccpd stop失败,在这种情况下,您应该在重新启动守护程序之前手动进行必要的清理。

正在尝试做的事情的正确方法是

sudo /etc/init.d/ccpd restart

(假设您的发行版使用传统的SysVinit - 如果它使用新手,则应该运行sudo service ccpd restart)。