Как подавить STDOUT / STDERR из выхода скрипта оболочки?

Я отвечаю сам себе. Ядро Archlinux для Odroid-C1 не включает модуль dm_raid, обязательный для доступа к зеркалам LVM (теперь raid1 по умолчанию).

Решение состоит в том, чтобы включить его в переменную MODULES файла /etc/mkinitcpio.conf и повторно создать uInitrd.

Проблема решена.

4
20.09.2018, 12:18
2 ответа

Когда вы видите [1] + 7766 Suspended (signal)..., это сообщение, напечатанное оболочкой, сообщающее вам, что один из ее дочерних процессов был приостановлен.

В примере fffнеобходимо рассмотреть два процесса оболочки. Ваша начальная интерактивная оболочка и сценарий оболочки, который запускается как дочерний процесс.

Ваш сценарий приостанавливает свою работу. Сообщение «Приостановлено» печатается интерактивной оболочкой. Так что это не вариант, который вы можете включать или выключать внутри скрипта .

Кроме того, в интерактивной оболочке нельзя установить параметр для включения или выключения этого конкретного сообщения. Невозможно "подавить" это сообщение по отдельности... в основном потому, что это никогда не то, что вы хотите делать :-).

Я думаю, что сценарий fffвсе равно не возобновится успешно. Я думаю, что можно было бы изменить его, чтобы сделать это. Тем не мение,возобновлять себя - ужасная идея. Когда вы приостанавливаете сценарий, интерактивная оболочка снова показывает свою командную строку. т.е. если вы не увидели сообщение «приостановлено», похоже, ваш сценарий завершился. Но в любом случае, если вашему сценарию удастся возобновить работу, он попытается вернуть контроль над терминалом у пользователя, независимо от того, что он начал делать в это время. Это не хорошо!


Я думаю, вам нужно понять, например. что если вы запустили процесс со своего терминала, и это дочерний процесс вашей интерактивной оболочки , то это абсолютно не демон процесс.

Чтобы запустить демон с вашего терминала, программа должна разветвить ()себя во время запуска. Исходный процесс должен завершиться, и это позволяет процессу, который продолжает повторно -быть родительским , например. (в традиционном unix с )на PID 1, также известный как процесс init. И есть еще шаги, которые он должен включать, чтобы отсоединиться от терминала. См., например, здесь:Демонизировать процесс в оболочке?

Кроме того, если ваша система использует systemd, вы должны понимать, что устаревшие скрипты /etc/init.d/необходимо запускать с помощью systemctl start. Упакованные скрипты init.dв Debian и в других местах включают хак совместимости, который делает это за вас. Но вы не должны не использовать эту функцию. Это рецепт путаницы. Написанный вами сценарий не имеет этой функции, поэтому вы должны использовать systemctl start fff.

Настоятельно не рекомендую пробовать использовать игры в скрипте fffв сочетании с systemctl start.

На самом деле systemctlиспользует другой подход для запуска фоновых служебных процессов. Он отправляет сообщение PID 1 (процессу инициализации systemd), и PID 1 запускает запрошенную программу. Если вы определяете собственную службу systemd, программе не нужно демонизировать себя. Если вы используете устаревший скрипт init.d,программе по-прежнему необходимо демонизировать себя, но единственное, чего она достигает, — это сообщение systemd, что сценарий init.dзавершил запуск. (Это позволяет заметить некоторые сбои при запуске демонов, хотя, к сожалению, многие существующие программы имеют сбои при запуске, которые могут произойти после этапа демонизации ).

Вы не хотите беспокоиться о том, будет ли и как systemdреагировать на остановку и возобновление init.dсценария.

2
27.01.2020, 20:59

Не уверен, правильно ли я понял вашу цель, но у меня это работает так:

  1. запустить «демон», на самом деле просто непрерывно работающий процесс:top -d1 >out

  2. во втором терминале вы можете tail -f outесли хотите

  3. в третьем терминале запускаюkill -STOP $(ps -eFH | grep "top -d" |grep -v grep|awk '{print $2}'

В первом терминале, откуда был запущен демон, вы увидите сообщение 'suspended', но в файле outтаких сообщений не будет.

0
27.01.2020, 20:59

Теги

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