Запустите фоновый процесс со сценария и управляйте им, когда сценарий закончится

Похож Вы используете gedit и evince (рассмотрите использование исходных приложений для KDE, kwrite и okular соответственно), которые являются оба GTK 3.

Я имел эту подобную проблему и был решен темами установки GTK в KDE: установите kde-config-gtk пакет и набор тема GTK (например, Кислородная тема - у меня нет Ubuntu здесь для проверки имени пакета, я думаю, что это oxygen-molecule).

15
24.10.2014, 19:26
1 ответ

Читать grep на стандартном входе. Вот вы идете, используя трубу ...

$ echo "$line" | grep select

... или последовательность ...

$ grep select <<< "$line"

Кроме того, вы можете заменить места новыми строками перед тем, как делать grepping:

$ echo "$line" | tr ' ' '\n' | grep select

... или вы можете попросить grep напечатать только совпадение:

$ echo "$line" | grep -o select

Это позволит вам избавиться от остальной части строки, когда есть совпадение.

Изменить: Ой, читать слишком быстро, спасибо Марко . Чтобы подсчитать вхождения, просто поместите любой из них в wc (1) ;)

Еще одну правку, выполненную после комментария lzkata , цитируя $ line при использовании echo .

-121--7017-

Нажатие Введите , чтобы завершить процесс в фоновом режиме.

Почти! Фактически, сценарий уже вышел к моменту нажатия Enter . Однако таким образом можно вернуть запрос (потому что оболочка снова печатает $ PS1 ).

Причина, по которой нажатие клавиш Ctrl + C приводит к их завершению, заключается в том, что они связаны. При выполнении сценария оболочка инициирует субоболочку, в которой она выполняется. Когда вы завершаете этот подслой, фоновый процесс исчезает, вероятно, от сигнала SIGHUP .

Разделите сценарий, фоновый процесс и подслой

С помощью nohup можно избавиться от этого небольшого неудобства.

#!/bin/sh
read -s -p "Enter Password: " pw
user=testuser
share=/fshare
cmd="sfk ftpserv -user=$user -pw=$pw -usedir $share=$share"
nohup $cmd &

Отказ от альтернативы

Если вы можете переключиться с /bin/sh на /bin/bash , вы также можете попытаться отказаться . Для получения дополнительных сведений просто введите help disown в экземпляре bash .

disown -h $cmd &

Уничтожение фонового процесса «красиво»

Теперь, когда дело доходит до уничтожения процесса, вы можете идеально сделать « Ctrl + C », используя kill . Только не отправляйте жестокий SIGKILL . Вместо этого можно использовать:

$ kill -2 [PID]
$ kill -15 [PID]

, который отправит хороший SIGINT (2) или SIGTERM (15) в ваш процесс. Можно также распечатать значение PID после запуска процесса:

...
nohup $cmd &
echo $!

... или даже лучше, заставьте сценарий ждать SIGINT и отправьте его обратно в фоновый процесс (при этом ваш сценарий останется на переднем плане) :

#!/bin/sh
read -s -p "Enter Password: " pw
user=testuser
share=/fshare
cmd="sfk ftpserv -user=$user -pw=$pw -usedir $share=$share"
nohup $cmd &

# Storing the background process' PID.
bg_pid=$!

# Trapping SIGINTs so we can send them back to $bg_pid.
trap "kill -2 $bg_pid" 2

# In the meantime, wait for $bg_pid to end.
wait $bg_pid

Если SIGINT недостаточно, используйте вместо этого SIGTERM (15):

trap "kill -15 $bg_pid" 2 15

В этом пути при получении скриптом SIGINT ( Ctrl + C , kill -2 ) или SIGTERM во время ожидания фонового процесса он просто передает ему сигналы. Если эти сигналы действительно убивают экземпляр sfk , то вызов wait возвращается, что также приводит к завершению сценария:)

18
27.01.2020, 19:50

Теги

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