Postfix не запускается, но dovecot в порядке.

Строка shebang интерпретируется ядром и не очень гибкая. В Linux он ограничен одним аргументом: синтаксис #! , необязательный пробел, путь к интерпретатору (не содержащий пробелов), необязательный пробел и, возможно, один аргумент (который может содержать пробелы, за исключением начала). Кроме того, общий размер строки shebang ограничен 128 байтами ( BINPRM_BUF_SIZE константа в исходниках ядра, используемая в load_script ).

Если вы хотите передать более одного аргумента, вам нужен обходной путь. Если вы используете #!/usr/bin/env для расширения пути, то есть место только для имени команды и никаких других аргументов.

Самый очевидный обходной путь — скрипт-оболочка. Вместо того, чтобы /path/to/my-script содержал код mocha, вы помещаете код mocha в какой-то другой файл /path/to/my-script.real и делаете /path/to/my-script небольшой сценарий оболочки.Вот пример оболочки, в которой предполагается, что реальный код находится в файле с тем же именем, что и скрипт, плюс .real в конце.

#!/bin/sh
exec mocha --reporter=tap --output=foo "$0.real" "$@"

С оболочкой оболочки вы можете воспользоваться возможностью делать более сложные вещи, такие как определение переменных среды, поиск доступных версий интерпретатора и т. д.

Использование exec перед интерпретатором гарантирует, что script будет выполняться в том же процессе, что и оболочка оболочки. Без exec, в зависимости от оболочки, он может работать как подпроцесс, что имеет значение, например. если вы хотите посылать сигналы сценарию.

Иногда скрипт-оболочка и фактический код могут находиться в одном файле, если вам удастся написать полиглот — файл, содержащий допустимый код на двух разных языках. Написание полиглотов не всегда легко (или даже возможно), но это имеет то преимущество, что не нужно управлять двумя отдельными файлами и развертывать их. Вот полиглот JavaScript/shell, где часть оболочки выполняет интерпретатор JS в файле (при условии, что интерпретатор JS игнорирует строку shebang, вы мало что можете сделать, если это не так):

#!/bin/sh
///bin/true; exec mocha --reporter=tap --output=foo "$0" "$@"
… (the rest is the JS code) …

1
19.11.2015, 02:41
1 ответ

У меня была та же проблема при использовании конфигурации, импортированной с предыдущего компьютера.

Вот как я решил эту проблему:

$ sudo rm -v /var/lib/postfix/master.lock
$ sudo systemctl start postfix

В моем случае также были проблемы с процессом постфикса, оставшимся от предыдущих попыток, вот решение:

- проверьте, что постфикс не запущен:

$ ps faxu | grep -i [p]ostfix
root     12854  0.0  0.2  92004  2236 ?        Ss   07:23   0:00 /usr/libexec/postfix/master -w
postfix  12855  0.0  0.4  98320  4088 ?        S    07:23   0:00  \_ pickup -l -t fifo -u
postfix  12856  0.0  0.4  98388  4128 ?        S    07:23   0:00  \_ qmgr -l -t fifo -u
postfix  12872  0.0  0.4  98332  4672 ?        S    07:29   0:00  \_ tlsmgr -l -t unix -u

- Если у вас запущены постфиксные процессы, уничтожьте их все:

$ sudo kill -9 12854 12855 12856 12872

- после уничтожения всех процессов удалите файл master.lock и запустите постфикс с помощью systemctl (см. Выше).

Наконец, не забывайте, что каталог queue_directory должен указывать на / var / spool / postfix ...

0
28.01.2020, 01:31

Теги

Похожие вопросы