OBSERVAÇÃO : O post antigo foi escrito no contexto da pergunta original do OP, antes de edição, por isso está incompleto, mas no contexto do que foi originalmente perguntado, ainda é válido.
Resposta atualizada:
A questão chave aqui é que
ExecStart=/usr/bin/python /usr/local/bin/app > /var/log/app.log 2>&1
Não tem o shell em execução, portanto, o redirecionamento >
e 2>&1
não será compreendido pelo systemd.
É por isso que o shell é necessário em todo o comando para que o redirecionamento possa funcionar. Quanto a -c
flag para shell, veja a versão antiga do post abaixo.
OLD POST
O sinal -c
em bash
e sh
significa a mesma coisa: execute os comandos conforme fornecidos nas cotas. Não há grande mistério.
Seu aplicativo que você está tentando executar pode ter um significado diferente para o sinalizador -c, portanto, não presuma que todos os sinalizadores de linha de comando são os mesmos para todos os comandos. Sem documentação para o aplicativo, é difícil dizer o que uma opção deve fazer.
Problema potencial aqui é que o interpretador python assumirá -c como seu próprio argumento de linha de comando, não para o aplicativo. Provavelmente, essa é a principal razão pela qual seu comando falha.
O ExecStart=/usr/bin/python /usr/local/bin/app -c /etc/app.json
deve ser capaz de processar seu comando. Eu testei com um pequeno script:
$ cat test_script.py
import sys
print sys.argv[1],sys.argv[0]
$ python test_script.py this is a test
this test_script.py
Melhor abordagem: um script deve ser executado com sudo chmod +x /usr/local/bin/app
e usado sozinho. O modo como é escrito originalmente, com / bin / sh, e depois python, chamando o script real é meio redundante. No exemplo do meu script de teste, seria assim:
$ cat test_script.py
#!/usr/bin/env python
import sys
print sys.argv[1],sys.argv[0]
$ chmod +x test_script.py
$ ./test_script.py this is a test
this ./test_script.py
Tenha em atenção que python
refere-se ao Python 2.7 no Ubuntu. Se você precisar usar especificamente o Python3, use / usr / bin / python3. A maneira mais preferida é que o aplicativo tenha #!/usr/bin/env python
ou #!/usr/bin/env python3
como primeira linha.