Linux 从bash脚本运行一些命令

Linux 从bash脚本运行一些命令,linux,bash,process,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

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

当我使用命令运行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中没有显示任何内容。因此,我无法诊断问题


如有任何建议,将不胜感激

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

pkill ccpd
因此,脚本启动、运行
pkill
(不产生任何输出)并立即自杀。塔达

最简单的解决方案是重命名脚本。您还可以执行以下操作:

kill $(pgrep -l ccpd | grep -v restartccpd | awk '{print $1}')
这将生成一个进程名称列表和与
ccpd
匹配的PID,然后从列表中删除
restartcpd
,然后使用
kill
终止进程,
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-如果它使用upstart,您应该运行
sudo service ccpd restart

您是说在脚本失败后,如果您键入这些命令,它会工作吗?我说的是,当从终端单独运行这三个命令时,它会工作。无论是在运行脚本之前还是之后。脚本在任何情况下都无法工作。如果脚本中没有
sudo
,脚本是否可以工作?不,我已经尝试了脚本,但里面没有任何sudo。谢谢。删除第一个
#/bin/bash
line解决了这个问题。知道为什么吗?
grep | awk
反惯用语可以改写为
awk'/restartcpd/{print$1}'
@larsks您的解决方案非常有效。知道为什么删除bin/bash行时它也可以工作吗?见我上面的评论。正确的诊断,但不是很好的修复。您的提案将终止名称中包含
ccpd
的任何其他进程
pkill
-x
选项仅用于此目的。我清楚地知道,我不想以这种方式重新启动守护程序,而以这种方式重新启动守护程序将是不可原谅的罪恶。但是,我们讨论的是一种特殊情况,即守护进程有自己的问题。如果你想知道情况,你会想访问这个网站()或者特别是这个评论()。@MMA我只是浏览了一下帖子,但我认为在这里正确的做法是修复
/etc/init.d/ccpd
。最后,请使用
pkill-x
。你试过问如何使这台打印机工作吗?