Сопоставить номера заданий оболочки с PID

Использовать статус выхода. Из справочной страницы nginx:

Exit status is 0 on success, or 1 if the command fails.

и изhttp://www.tldp.org/LDP/abs/html/exit-status.html:

$? reads the exit status of the last command executed.

Пример:

[root@d ~]# /usr/local/nginx/sbin/nginx -t;echo $?
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is     successful
0
[root@d ~]# echo whatever > /usr/local/nginx/nonsense.conf
[root@d ~]# /usr/local/nginx/sbin/nginx -t -c nonsense.conf;echo $?
nginx: [emerg] unexpected end of file, expecting ";" or "}" in /usr/local/nginx/nonsense.conf:2
nginx: configuration file /usr/local/nginx/nonsense.conf test failed
1

Пример сценария:

#!/bin/bash
/usr/local/nginx/sbin/nginx -t 2>/dev/null > /dev/null
if [[ $? == 0 ]]; then
 echo "success"
 # do things on success
else
 echo "fail"
 # do whatever on fail
fi

3
08.08.2020, 18:23
3 ответа

В bashвы можете приблизиться к этому, предоставив пользовательскую $PROMPT_COMMANDнастройку переменных для -вылета из текущего списка заданий.

Доказательство -концепции -:

$ PROMPT_COMMAND='unset ${!j*}; eval "$(jobs -l | awk '\''{gsub("[^[:digit:] ]", ""); printf "j%d=%d\n", $1, $2}'\'')"'

Затем вы должны сделать pidtree $j2вместо pidtree %2, предполагая, что в $IFSнет чисел, иначе вам придется заключить $j2в кавычки, что потребует еще двух нажатий клавиш.

2
18.03.2021, 23:15

Не проще ли просто запомнить PID при создании фоновых заданий?

bash:

declare -a bgjobpids
[...]
do_some_thing &
pid=$!
index=${#bgjobpids[@]}
bgjobpids[index]=$pid
[...]
do_some_thing_else &
pid=$!
index=${#bgjobpids[@]}
bgjobpids[index]=$pid
0
18.03.2021, 23:15

Если вы хотите, чтобы это было только для нескольких команд, то можно использовать программируемое завершение. Скорее всего, это не POSIX, но, по крайней мере, он доступен в нескольких оболочках (, и базовый механизм даже не обязательно должен быть одним и тем же ).

Таким образом, вы должны ввестиpidtree %2Tab , и оболочка преобразует это в

pidtree 31736

Я бы счел это элегантным и удобным.

Недостаток :Сохранение существующих конфигураций завершения для этих команд требует ручного вмешательства (например, :сначала запустите вашу функцию; если он не совпадает, заставьте его вызывать исходный ).

_pidtree () {
    local job pid
    if [[ ${COMP_WORDS[COMP_CWORD]} =~ ^%[1-9][0-9]* ]]; then
        job="${COMP_WORDS[COMP_CWORD]:1}"
        pid="$(jobs -l | awk -v job="$job" '$1 ~ "^\\[" job "\\]" { print $2; }')"
        COMPREPLY=("$pid")
    fi
}

complete -F _pidtree pidtree

Это работает в bash. Это можно было бы сделать без awk, и это, безусловно, можно сделать более совместимым способом.

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

1
18.03.2021, 23:15

Теги

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