Проблема с AWK внутри bash

Вы должны сделать это, используя следующую команду:

gsettings set org.gnome.desktop.session idle-delay 2700

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

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

Боковое примечание

Как я узнал? Я сбросил мои текущие настройки, используя следующую команду:

for s in $(gsettings list-schemas); do for k in $(gsettings list-keys $s); do echo -n "$s/$k: "; gsettings get $s $k; done; done >gsettings.1

Затем изменил настройку, используя диалог настроек gnome. Затем снова запустите команду, но замените gsettings.1 на gsettings.2, чтобы снова сбросить настройки в другой файл.

Впоследствии я мог использовать diff, чтобы увидеть, какой ключ был изменен:

diff gsettings.1 gsettings.2
1883c1883
< org.gnome.desktop.session/idle-delay: uint32 900
---
> org.gnome.desktop.session/idle-delay: uint32 600
1
задан 11 May 2018 в 18:01

6 ответов

При запуске ./killProcess.sh somename существует процесс, подобный

/bin/bash ./killProcess.sh somename

, и строка ps | grep | grep | awk также находит это, потому что в нем есть текст somename. Я не совсем уверен, почему у вас есть два дополнительных PID (и не только один), но я считаю, что между bash и killProcess.sh существует несколько родительских / дочерних элементов. В одной строке PID отображается как PID, а другой - как PPID.

Вы можете избежать этих PID, отбросив их на основании имени скрипта. Он сохраняется в $0, поэтому

PID=$(ps -ef | grep $PROCESSNAME | grep -v grep | grep -v $0 | awk '{print $2}');

или (с меньшим количеством программных вызовов):

PID=$(ps -ef | grep $PROCESSNAME | grep -v -e grep -e $0 | awk '{print $2}');

Другой (более безопасный) способ состоял бы в том, чтобы удалить PID сценария , Он хранится в $$:

PID=$(ps -ef | grep $PROCESSNAME | grep -v -e grep -e $$ | awk '{print $2}');

Или все это в awk:

PID=$(ps -ef | awk "/$PROCESSNAME/ && !/awk/ && !/$$/ {print \$2}");

Нам нужно избежать \$2 здесь, чтобы он не был " t интерпретируется оболочкой, но awk. Эта команда означает:

Если строка содержит $PROCESSNAME и не содержит awk и не содержит нашего собственного PID, тогда напечатайте второй столбец.

Преимущество (теоретически), что это работает быстрее, потому что требуется только одна дополнительная команда (awk), а не 3 greps и awk.

Но:

Все эти greps и awks не идеальны, и вы всегда найдете ситуацию, которую мы здесь не видим (например, частичные совпадения и т. д.). Поэтому я рекомендую использовать один из уже написанных инструментов:

killall somename # для предварительного просмотра, первый запуск killall -v -s 0 somename pgrep somename # просто введите PID pkill somename #, аналогичный killall
2
ответ дан 22 May 2018 в 10:47
  • 1
    Очень хорошо объяснено. Спасибо, сэр! – Jorge Campos 11 May 2018 в 21:11

При запуске ./killProcess.sh somename существует процесс, подобный

/bin/bash ./killProcess.sh somename

, и строка ps | grep | grep | awk также находит это, потому что в нем есть текст somename. Я не совсем уверен, почему у вас есть два дополнительных PID (и не только один), но я считаю, что между bash и killProcess.sh существует несколько родительских / дочерних элементов. В одной строке PID отображается как PID, а другой - как PPID.

Вы можете избежать этих PID, отбросив их на основании имени скрипта. Он сохраняется в $0, поэтому

PID=$(ps -ef | grep $PROCESSNAME | grep -v grep | grep -v $0 | awk '{print $2}');

или (с меньшим количеством программных вызовов):

PID=$(ps -ef | grep $PROCESSNAME | grep -v -e grep -e $0 | awk '{print $2}');

Другой (более безопасный) способ состоял бы в том, чтобы удалить PID сценария , Он хранится в $$:

PID=$(ps -ef | grep $PROCESSNAME | grep -v -e grep -e $$ | awk '{print $2}');

Или все это в awk:

PID=$(ps -ef | awk "/$PROCESSNAME/ && !/awk/ && !/$$/ {print \$2}");

Нам нужно избежать \$2 здесь, чтобы он не был " t интерпретируется оболочкой, но awk. Эта команда означает:

Если строка содержит $PROCESSNAME и не содержит awk и не содержит нашего собственного PID, тогда напечатайте второй столбец.

Преимущество (теоретически), что это работает быстрее, потому что требуется только одна дополнительная команда (awk), а не 3 greps и awk.

Но:

Все эти greps и awks не идеальны, и вы всегда найдете ситуацию, которую мы здесь не видим (например, частичные совпадения и т. д.). Поэтому я рекомендую использовать один из уже написанных инструментов:

killall somename # для предварительного просмотра, первый запуск killall -v -s 0 somename pgrep somename # просто введите PID pkill somename #, аналогичный killall
2
ответ дан 17 July 2018 в 14:34

При запуске ./killProcess.sh somename существует процесс, подобный

/bin/bash ./killProcess.sh somename

, и строка ps | grep | grep | awk также находит это, потому что в нем есть текст somename. Я не совсем уверен, почему у вас есть два дополнительных PID (и не только один), но я считаю, что между bash и killProcess.sh существует несколько родительских / дочерних элементов. В одной строке PID отображается как PID, а другой - как PPID.

Вы можете избежать этих PID, отбросив их на основании имени скрипта. Он сохраняется в $0, поэтому

PID=$(ps -ef | grep $PROCESSNAME | grep -v grep | grep -v $0 | awk '{print $2}');

или (с меньшим количеством программных вызовов):

PID=$(ps -ef | grep $PROCESSNAME | grep -v -e grep -e $0 | awk '{print $2}');

Другой (более безопасный) способ состоял бы в том, чтобы удалить PID сценария , Он хранится в $$:

PID=$(ps -ef | grep $PROCESSNAME | grep -v -e grep -e $$ | awk '{print $2}');

Или все это в awk:

PID=$(ps -ef | awk "/$PROCESSNAME/ && !/awk/ && !/$$/ {print \$2}");

Нам нужно избежать \$2 здесь, чтобы он не был " t интерпретируется оболочкой, но awk. Эта команда означает:

Если строка содержит $PROCESSNAME и не содержит awk и не содержит нашего собственного PID, тогда напечатайте второй столбец.

Преимущество (теоретически), что это работает быстрее, потому что требуется только одна дополнительная команда (awk), а не 3 greps и awk.

Но:

Все эти greps и awks не идеальны, и вы всегда найдете ситуацию, которую мы здесь не видим (например, частичные совпадения и т. д.). Поэтому я рекомендую использовать один из уже написанных инструментов:

killall somename # для предварительного просмотра, первый запуск killall -v -s 0 somename pgrep somename # просто введите PID pkill somename #, аналогичный killall
2
ответ дан 20 July 2018 в 14:39

Я когда-то реализовал аналогичную идею, такую ​​как функция оболочки, которую я называю psg (для «ps | grep»)

psg() {
    local -a patterns=()
    (( $# == 0 )) && set -- $USER
    for arg do 
        patterns+=( "-e" "[${arg:0:1}]${arg:1}" )
    done
    ps -ef | grep "${patterns[@]}"
}

Это использует трюк для размещения первого символа шаблон в скобках, поэтому вы получаете

ps -ef | grep "[s]omename"

Это позволяет вам отбросить часть grep -v grep конвейера.

Если вы не передадите какие-либо аргументы, он использует ваши имя пользователя для поиска ваших процессов.

2
ответ дан 22 May 2018 в 10:47
  • 1
    Спасибо, попробуй. – Jorge Campos 11 May 2018 в 19:50
  • 2
    Это не работает. Он ничего не печатает. Должен ли процесс работать с пользователем, который вызывает сценарий? – Jorge Campos 11 May 2018 в 19:56
  • 3
    [F1] – glenn jackman 11 May 2018 в 20:34
  • 4
    Ох ... Хорошо, спасибо за разъяснение. Но это не то, что мне нужно. Я буду называть это командой ssh ​​через CI-сервер (не уверен, как это сделать с вашей версией). Я понял, как исправить мой скрипт с помощью PerlDuck. – Jorge Campos 11 May 2018 в 20:34
  • 5
    @glenn Вы сделали эту опечатку специально, не так ли? ;-) Мне это нравится. – PerlDuck 11 May 2018 в 20:53

Я когда-то реализовал аналогичную идею, такую ​​как функция оболочки, которую я называю psg (для «ps | grep»)

psg() { local -a patterns=() (( $# == 0 )) && set -- $USER for arg do patterns+=( "-e" "[${arg:0:1}]${arg:1}" ) done ps -ef | grep "${patterns[@]}" }

Это использует трюк для размещения первого символа шаблон в скобках, поэтому вы получаете

ps -ef | grep "[s]omename"

Это позволяет вам отбросить часть grep -v grep конвейера.

Если вы не передадите какие-либо аргументы, он использует ваши имя пользователя для поиска ваших процессов.

2
ответ дан 17 July 2018 в 14:34

Я когда-то реализовал аналогичную идею, такую ​​как функция оболочки, которую я называю psg (для «ps | grep»)

psg() { local -a patterns=() (( $# == 0 )) && set -- $USER for arg do patterns+=( "-e" "[${arg:0:1}]${arg:1}" ) done ps -ef | grep "${patterns[@]}" }

Это использует трюк для размещения первого символа шаблон в скобках, поэтому вы получаете

ps -ef | grep "[s]omename"

Это позволяет вам отбросить часть grep -v grep конвейера.

Если вы не передадите какие-либо аргументы, он использует ваши имя пользователя для поиска ваших процессов.

2
ответ дан 20 July 2018 в 14:39
  • 1
    Это не работает. Он ничего не печатает. Должен ли процесс работать с пользователем, который вызывает сценарий? – Jorge Campos 11 May 2018 в 19:56
  • 2
    Как вы его разрушаете? Это функция оболочки, поэтому вы не помещаете ее в файл и называете ее как скрипт: вставьте ее в командной строке и назовите ее как psg somename – glenn jackman 11 May 2018 в 20:29
  • 3
    [F1] – glenn jackman 11 May 2018 в 20:34
  • 4
    Ох ... Хорошо, спасибо за разъяснение. Но это не то, что мне нужно. Я буду называть это командой ssh ​​через CI-сервер (не уверен, как это сделать с вашей версией). Я понял, как исправить мой скрипт с помощью PerlDuck. – Jorge Campos 11 May 2018 в 20:34
  • 5
    @glenn Вы сделали эту опечатку специально, не так ли? ;-) Мне это нравится. – PerlDuck 11 May 2018 в 20:53

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

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