从bash脚本运行几个命令

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

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

sudo ./restartccpd.bash 

屏幕上没有任何内容出现。 还发行

 sudo /etc/init.d/ccpd status 

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

脚本的内容是,

 #!/bin/bash sudo pkill -9 ccpd sudo /etc/init.d/ccpd start sudo /etc/init.d/ccpd status 

从terminal运行时,这些命令可以正常工作。 但是,如上所述,作为脚本运行时,它并不像预期的那样工作。

我尝试在命令之间插入睡眠命令,无济于事。 此外,syslog中没有任何内容。 所以,我无法诊断问题。

任何build议将不胜感激。

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

 pkill ccpd 

所以脚本启动,运行pkill (不产生输出),并迅速杀死自己。 达达!

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

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

这会生成一个与ccpd匹配的进程名称和pid列表,然后从列表中删除restartccpd ,然后用kill restartccpd进程。

当larsk正确诊断 , pkill 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 )。