Заглянув в /etc/init.d/functions
на старой системе CentOS, функция daemon
эффективно выполняет
/bin/bash -c "[...] ; $*"
$*
expands to к аргументам функции, разделенным пробелами, эффективно теряя лишние кавычки вокруг "udp...localhost)". Результат передается в новый shell, который видит следующее:
/root/amr/bin/pcdaemon --daemon -i ens192 -f udp && portrange 3000-8000 && not(src host localhost)
и запускает его как командную строку. &&
в этот момент не заключен в кавычки, поэтому интерпретируется оболочкой как foo && bar
, что означает "запустить foo, затем, если это удастся, запустить bar". Как оказалось, not(src...
вызывает синтаксическую ошибку, поэтому ничего не выполняется. Замена not
на !
не поможет, потому что, хотя это и устраняет синтаксическую ошибку, оболочка теперь запускает pcdaemon
с усеченными аргументами, а затем пытается запустить программу под названием portrange
.
Помимо того, что Red Hat исправит сценарий, вы можете обойти эту проблему, поместив командную строку pcdaemon
в отдельный сценарий (как предложил
Mark Plotnick), или добавив другой набор кавычек. С текущей функцией daemon
, я думаю, это должно работать:
daemon /root/amr/bin/pcdaemon --daemon -i ens192 -f "'udp && portrange 3000-8000 && not(src host localhost)'"
(Хотя если кто-то действительно исправит функцию daemon
, то это даст дополнительные кавычки для pcdaemon
)
.