Что означает / bin / bash -c в сервисе?

Чтобы автозапуск приложения во время перезагрузки.

sudo vi /etc/systemd/system/app.service [Unit] Description=app After=network.target [Service] ExecStart=/usr/bin/python /usr/local/bin/app [Install] WantedBy=multi-user.target sudo systemctl daemon-reload sudo systemctl enable app.service

Теперь автозапуск приложения во время перезагрузки. Я хочу, чтобы приложение записывало всю выходную информацию в /var/log/app.log. Вот что я делаю. 1.sudo touch /var/log/app.log 2. изменить только ExecStart.

ExecStart=/usr/bin/python /usr/local/bin/app > /var/log/app.log 2>&1

Приложение может запускаться, но не записывается в файл /var/log/app.log. Корень выполнит приложение. Это доказательство здесь.

ps aux|grep app root 246 0.0 3.8 56052 10056 ? Ss 00:57 0:00 /usr/bin/python /usr/local/bin/app > /var/log/app.log 2>&1

Почему у root нет разрешения на запись журнала в /var/log/app.log?

Чтобы изменить инструкцию ExecStart в

ExecStart=/bin/sh -c '/usr/bin/python /usr/local/bin/app > /var/log/app.log 2>&1'

Проблема решена. 1.Почему root не имеет права записывать запись в /var/log/app.log? 2. Что делает / bin / bash -c среднее значение в сервисе?

5
задан 5 May 2017 в 03:50

12 ответов

ПРИМЕЧАНИЕ. Старое сообщение было написано в контексте исходного вопроса OP перед редактированием, поэтому оно является неполным, но в контексте того, что изначально было задано, оно все еще действует.

Обновленный ответ:

Ключевая проблема здесь в том, что

ExecStart=/usr/bin/python /usr/local/bin/app   > /var/log/app.log 2>&1

Не работает оболочка, поэтому ваше перенаправление > и 2>&1 не будет понято systemd.

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

ПРИМЕЧАНИЕ

Флаг -c в обоих bash и sh означает то же самое: выполните команды как предусмотренные в кавычках. Нет великой тайны.

Ваше приложение, которое вы пытаетесь запустить, может иметь другое значение для флага -c, поэтому не предполагайте, что все флаги командной строки одинаковы для всех команд. Без документации для приложения трудно сказать, какой вариант должен делать.

Потенциальная проблема здесь в том, что интерпретатор python будет считать -c своим аргументом командной строки, а не приложением. Вероятно, это основная причина, по которой ваша команда не работает.

ExecStart=/usr/bin/python /usr/local/bin/app -c /etc/app.json должен иметь возможность обрабатывать вашу команду. Я протестировал его с помощью небольшого скрипта:

$ 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

Лучший подход: сценарий должен быть выполнен с помощью sudo chmod +x /usr/local/bin/app и использоваться сам по себе. Способ, которым он написан первоначально, с / bin / sh, затем python, а затем вызов реального скрипта является излишним. В примере моего тестового сценария это будет так:

$ 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

Остерегайтесь, что python относится к Python 2.7 на Ubuntu. Если вам нужно использовать Python3 специально, вместо этого используйте / usr / bin / python3. Наиболее предпочтительным способом является приложение для #!/usr/bin/env python или #!/usr/bin/env python3 в качестве первой строки.

2
ответ дан 22 May 2018 в 22:57
  • 1
    Я переписываю пост в соответствии с реальной средой, чтобы сделать его более понятным. – it_is_a_literature 4 May 2017 в 08:37

ПРИМЕЧАНИЕ. Старое сообщение было написано в контексте исходного вопроса OP перед редактированием, поэтому оно является неполным, но в контексте того, что изначально было задано, оно все еще действует.

Обновленный ответ:

Ключевая проблема здесь в том, что

ExecStart=/usr/bin/python /usr/local/bin/app > /var/log/app.log 2>&1

Не работает оболочка, поэтому ваше перенаправление > и 2>&1 не будет понято systemd.

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

ПРИМЕЧАНИЕ

Флаг -c в обоих bash и sh означает то же самое: выполните команды как предусмотренные в кавычках. Нет великой тайны.

Ваше приложение, которое вы пытаетесь запустить, может иметь другое значение для флага -c, поэтому не предполагайте, что все флаги командной строки одинаковы для всех команд. Без документации для приложения трудно сказать, какой вариант должен делать.

Потенциальная проблема здесь в том, что интерпретатор python будет считать -c своим аргументом командной строки, а не приложением. Вероятно, это основная причина, по которой ваша команда не работает.

ExecStart=/usr/bin/python /usr/local/bin/app -c /etc/app.json должен иметь возможность обрабатывать вашу команду. Я протестировал его с помощью небольшого скрипта:

$ 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

Лучший подход: сценарий должен быть выполнен с помощью sudo chmod +x /usr/local/bin/app и использоваться сам по себе. Способ, которым он написан первоначально, с / bin / sh, затем python, а затем вызов реального скрипта является излишним. В примере моего тестового сценария это будет так:

$ 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

Остерегайтесь, что python относится к Python 2.7 на Ubuntu. Если вам нужно использовать Python3 специально, вместо этого используйте / usr / bin / python3. Наиболее предпочтительным способом является приложение для #!/usr/bin/env python или #!/usr/bin/env python3 в качестве первой строки.

2
ответ дан 18 July 2018 в 13:51

ПРИМЕЧАНИЕ. Старое сообщение было написано в контексте исходного вопроса OP перед редактированием, поэтому оно является неполным, но в контексте того, что изначально было задано, оно все еще действует.

Обновленный ответ:

Ключевая проблема здесь в том, что

ExecStart=/usr/bin/python /usr/local/bin/app > /var/log/app.log 2>&1

Не работает оболочка, поэтому ваше перенаправление > и 2>&1 не будет понято systemd.

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

ПРИМЕЧАНИЕ

Флаг -c в обоих bash и sh означает то же самое: выполните команды как предусмотренные в кавычках. Нет великой тайны.

Ваше приложение, которое вы пытаетесь запустить, может иметь другое значение для флага -c, поэтому не предполагайте, что все флаги командной строки одинаковы для всех команд. Без документации для приложения трудно сказать, какой вариант должен делать.

Потенциальная проблема здесь в том, что интерпретатор python будет считать -c своим аргументом командной строки, а не приложением. Вероятно, это основная причина, по которой ваша команда не работает.

ExecStart=/usr/bin/python /usr/local/bin/app -c /etc/app.json должен иметь возможность обрабатывать вашу команду. Я протестировал его с помощью небольшого скрипта:

$ 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

Лучший подход: сценарий должен быть выполнен с помощью sudo chmod +x /usr/local/bin/app и использоваться сам по себе. Способ, которым он написан первоначально, с / bin / sh, затем python, а затем вызов реального скрипта является излишним. В примере моего тестового сценария это будет так:

$ 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

Остерегайтесь, что python относится к Python 2.7 на Ubuntu. Если вам нужно использовать Python3 специально, вместо этого используйте / usr / bin / python3. Наиболее предпочтительным способом является приложение для #!/usr/bin/env python или #!/usr/bin/env python3 в качестве первой строки.

2
ответ дан 24 July 2018 в 20:16

ПРИМЕЧАНИЕ. Старое сообщение было написано в контексте исходного вопроса OP перед редактированием, поэтому оно является неполным, но в контексте того, что изначально было задано, оно все еще действует.

Обновленный ответ:

Ключевая проблема здесь в том, что

ExecStart=/usr/bin/python /usr/local/bin/app > /var/log/app.log 2>&1

Не работает оболочка, поэтому ваше перенаправление > и 2>&1 не будет понято systemd.

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

ПРИМЕЧАНИЕ

Флаг -c в обоих bash и sh означает то же самое: выполните команды как предусмотренные в кавычках. Нет великой тайны.

Ваше приложение, которое вы пытаетесь запустить, может иметь другое значение для флага -c, поэтому не предполагайте, что все флаги командной строки одинаковы для всех команд. Без документации для приложения трудно сказать, какой вариант должен делать.

Потенциальная проблема здесь в том, что интерпретатор python будет считать -c своим аргументом командной строки, а не приложением. Вероятно, это основная причина, по которой ваша команда не работает.

ExecStart=/usr/bin/python /usr/local/bin/app -c /etc/app.json должен иметь возможность обрабатывать вашу команду. Я протестировал его с помощью небольшого скрипта:

$ 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

Лучший подход: сценарий должен быть выполнен с помощью sudo chmod +x /usr/local/bin/app и использоваться сам по себе. Способ, которым он написан первоначально, с / bin / sh, затем python, а затем вызов реального скрипта является излишним. В примере моего тестового сценария это будет так:

$ 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

Остерегайтесь, что python относится к Python 2.7 на Ubuntu. Если вам нужно использовать Python3 специально, вместо этого используйте / usr / bin / python3. Наиболее предпочтительным способом является приложение для #!/usr/bin/env python или #!/usr/bin/env python3 в качестве первой строки.

2
ответ дан 31 July 2018 в 12:32

Это не вопрос разрешений. В выполнении строки ExecStart просто нет оболочки. Только команда и параметры, которые должны быть переданы этой команде, но не перенаправляются, не транслируются и не контактируются с ;, ни подстановкой, ни какой-либо другой функциональностью оболочки. Таким образом, ваши «перенаправления» передаются в качестве параметров вашего приложения (только вы знаете, как ваше приложение справляется с этим).

Вы можете изменить это, вызвав оболочку и предоставив команду и перенаправления в качестве командной строки для оболочка. Это вариант -c.

Но подумайте о том, почему не использовать службы и вести журнал, как предполагалось в systemd: по умолчанию stdout и stderr системного блока отправляются в syslog. Вы можете настроить его с помощью строки StandardOutput= в своей службе. Посмотрите на man systemd.exec

3
ответ дан 22 May 2018 в 22:57

sudo vi /etc/systemd/system/app.service

[Unit]
Description=app
After=network.target

[Service]
ExecStart=/usr/bin/python /usr/local/bin/app  
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target

sudo systemctl daemon-reload sudo systemctl enable app.service

Поиск журнала приложения с помощью команды журнала .

sudo journalctl  -u  app
1
ответ дан 22 May 2018 в 22:57

sudo vi /etc/systemd/system/app.service

[Unit] Description=app After=network.target [Service] ExecStart=/usr/bin/python /usr/local/bin/app StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target

sudo systemctl daemon-reload sudo systemctl enable app.service

Поиск журнала приложения с помощью команды журнала .

sudo journalctl -u app
1
ответ дан 18 July 2018 в 13:51

Это не вопрос разрешений. В выполнении строки ExecStart просто нет оболочки. Только команда и параметры, которые должны быть переданы этой команде, но не перенаправляются, не транслируются и не контактируются с ;, ни подстановкой, ни какой-либо другой функциональностью оболочки. Таким образом, ваши «перенаправления» передаются в качестве параметров вашего приложения (только вы знаете, как ваше приложение справляется с этим).

Вы можете изменить это, вызвав оболочку и предоставив команду и перенаправления в качестве командной строки для оболочка. Это вариант -c.

Но подумайте о том, почему не использовать службы и вести журнал, как предполагалось в systemd: по умолчанию stdout и stderr системного блока отправляются в syslog. Вы можете настроить его с помощью строки StandardOutput= в своей службе. Посмотрите на man systemd.exec

3
ответ дан 18 July 2018 в 13:51

sudo vi /etc/systemd/system/app.service

[Unit] Description=app After=network.target [Service] ExecStart=/usr/bin/python /usr/local/bin/app StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target

sudo systemctl daemon-reload sudo systemctl enable app.service

Поиск журнала приложения с помощью команды журнала .

sudo journalctl -u app
1
ответ дан 24 July 2018 в 20:16

Это не вопрос разрешений. В выполнении строки ExecStart просто нет оболочки. Только команда и параметры, которые должны быть переданы этой команде, но не перенаправляются, не транслируются и не контактируются с ;, ни подстановкой, ни какой-либо другой функциональностью оболочки. Таким образом, ваши «перенаправления» передаются в качестве параметров вашего приложения (только вы знаете, как ваше приложение справляется с этим).

Вы можете изменить это, вызвав оболочку и предоставив команду и перенаправления в качестве командной строки для оболочка. Это вариант -c.

Но подумайте о том, почему не использовать службы и вести журнал, как предполагалось в systemd: по умолчанию stdout и stderr системного блока отправляются в syslog. Вы можете настроить его с помощью строки StandardOutput= в своей службе. Посмотрите на man systemd.exec

3
ответ дан 24 July 2018 в 20:16

sudo vi /etc/systemd/system/app.service

[Unit] Description=app After=network.target [Service] ExecStart=/usr/bin/python /usr/local/bin/app StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target

sudo systemctl daemon-reload sudo systemctl enable app.service

Поиск журнала приложения с помощью команды журнала .

sudo journalctl -u app
1
ответ дан 31 July 2018 в 12:32

Это не вопрос разрешений. В выполнении строки ExecStart просто нет оболочки. Только команда и параметры, которые должны быть переданы этой команде, но не перенаправляются, не транслируются и не контактируются с ;, ни подстановкой, ни какой-либо другой функциональностью оболочки. Таким образом, ваши «перенаправления» передаются в качестве параметров вашего приложения (только вы знаете, как ваше приложение справляется с этим).

Вы можете изменить это, вызвав оболочку и предоставив команду и перенаправления в качестве командной строки для оболочка. Это вариант -c.

Но подумайте о том, почему не использовать службы и вести журнал, как предполагалось в systemd: по умолчанию stdout и stderr системного блока отправляются в syslog. Вы можете настроить его с помощью строки StandardOutput= в своей службе. Посмотрите на man systemd.exec

3
ответ дан 31 July 2018 в 12:32

Другие вопросы по тегам:

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