Как перезапустить файловые операции (файловый проводник) на рабочем столе MATE?

Примечание о переносимости . Формат вывода для ps -A не определен POSIX для несовместимых с Unix систем (например, FreeBSD) (вы заметите, что разделы формата вывода и описание ] -f все помечены в спецификации тегами XSI ), поэтому вы не можете действительно постобработать его надежно переносимым образом.

Например, с помощью ps из procps в Linux он выведет столбцы PID TTY TIME CMD (где CMD - это имя процесса, а не аргументы команды), в то время как во FreeBSD он выводит PID TT STAT TIME COMMAND (с аргументами COMMAND ).

Учитывая, что вы используете grep -v grep , я полагаю, вы ожидаете последнего или, по крайней мере, того, что ps -A выводит аргументы команды, которую процесс выполнил как в отличие от просто имени процесса (обычно производного от имени файла последней команды выполнения или первого (0 th ) аргумента).

Если ваш grep предназначен для grep только для аргументов команды, вы должны использовать:

ps -A -o pid= -o args=

, вывод которого указан в POSIX.

Ваша проблема в том, что mykill убивает себя, потому что mykill foo соответствует foo .

Другая проблема заключается в том, что mykill grep ничего не убивает.

Здесь вы можете сделать:

#! /bin/sh -
PATTERN=${1?} export PATTERN
trap '' TERM # ignore SIGTERM for the shell and its children
ps -A -o pid= -o args= | awk '$0 ~ ENVIRON["PATTERN"] {
  system("kill " $1); exit}'

(обратите внимание, что в POSIX не указан ни путь к утилите POSIX sh , ни механизм she-bang, поэтому / bin / sh ] может не быть оболочкой POSIX. Однако на практике she-bang поддерживается в большинстве систем POSIX, а / bin / sh является либо POSIX sh , либо Bourne sh и приведенный выше код должны работать в обоих).

Хотя это не идеально, поскольку он всегда возвращает истинный (0) статус выхода, даже если процесс не найден. Лучшим подходом было бы:

#! /bin/sh -
pattern=${1?}
trap '' TERM # ignore SIGTERM for the shell and its children
ps -A -o pid= -o args= | grep -e "$pattern" | {
  read pid args && kill "$pid"
}

В обоих случаях мы убиваем только первый совпадающий процесс, как подсказывает ваш подход grep -m 1 .

Теперь, с помощью trap '' SIGTERM мы гарантируем, что наши процессы не будут убиты, что было бы нормально, если бы мы убили все соответствующие процессы, но поскольку здесь мы убивает только первый совпадающий, проблема в том, что первым вполне может быть тот, который выполняет шаблон mykill или шаблон grep .

Вместо добавления некоторого grep -ve grep -e mykill (что не будет надежным, поскольку может исключить больше процессов, чем предполагалось), вы можете попытаться сравнить идентификаторы процессов совпадающих процессов.

#! /bin/sh -
pattern=${1?}
trap '' TERM # ignore SIGTERM for the shell and its children
             # just in case
psoutput=$(exec ps -A -o pid= -o ppid= -o args=)
printf '%s\n' "$psoutput" | grep -e "$pattern" | {
  while read -r pid ppid args; do
    if [ "$pid" -ne "$$" ] && [ "$ppid" -ne "$$" ]; then
      kill "$pid"
      exit # with the exit status of kill above
    fi
  done
  exit 1 # not found
}

(обратите внимание, что $ (...) и read -r являются POSIX, но не Bourne).

Или используя ksh93 , bash , zsh или yash (ни одна из которых не является командами POSIX), то есть оболочку с встроенное сопоставление регулярных выражений:

#! /bin/bash -
pattern=${1?}
trap '' TERM # ignore SIGTERM for the shell and its children
             # just in case
psoutput=$(exec ps -A -o pid= -o ppid= -o args=)
printf '%s\n' "$psoutput" | {
  while read -r pid ppid args; do
    if ((pid != $$ && ppid != $$)) && [[ $args =~ $pattern ]]; then
      kill "$pid"
      exit # with the exit status of kill above
    fi
  done
  exit 1 # not found
}

2
26.08.2016, 01:24
1 ответ

Si el explorador puede salir solo:

caja --quit
nautilus --quit

el escritorio se reiniciará automáticamente.

2
27.01.2020, 21:56

Теги

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