Мне нужен полный путь/, управляют, чтобы это было execued для запуска процесса, это выставляется в сети - слушает на tcp/udp. Мне действительно удавалось получить все то использование ниже "одного лайнера":
netstat -nlp46|tail -n +3 | while IFS=" " read -r -a line;
do nb=${#line[@]};
PID=$(echo ${line[$((nb - 1))]} | awk -F'/' '{print $1}');
CMD=$(ps -ef|awk '$2 == '"$PID" |awk -F" " '{out=$8; for(i=9;i<=NF;i++){out=out""$i}; print out}');
echo $PID^$CMD;
done
но когда процесс содержит некоторые специальные символы в командной строке, например, тонкий сервер, сценарий имеет некоторые проблемы со следующей ошибкой
awk: line 1: missing ) near end of line
когда я действительно выполнял часть сценария против того процесса, у меня не было проблем
root@ftp-host02:~# PID=15000; COMMAND=$(ps -ef|awk '$2 == '"$PID" |awk '{out=$8; for(i=9;i<=NF;i++){out=out" "$i}; print out}');
echo $COMMAND
thin server (0.0.0.0:3000)
Что я делаю неправильно здесь?
Спасибо
Ошибка здесь: awk '$ 2 ==' "$ PID"
если $ PID
не является строго числовым, то вы делаете проверка равенства для строки без кавычек, так что, действительно, кто знает, как awk ее интерпретирует?
$ PID = "3000)"
$ echo привет | mawk '$ 2 ==' "$ PID"
mawk: строка 1: extra ')'
Передача переменной оболочки в awk как переменной awk (с параметром -v
) очищает это.
Очистив ваш код другими способами, мы имеем:
netstat -nlp46 |
tail -n +3 |
while IFS=" " read -r -a fields; do
nb=${#fields[@]}
PID=${fields[nb-1]%%/*}
CMD=$( ps -ef | awk -v pid="$PID" '$2 == pid {out=$8; for(i=9;i<=NF;i++){out=out $i}; print out}' );
echo "$PID^$CMD";
done
Примечания:
$ {ary [n-1]}
будет работать -v
option Не могли бы вы попробовать это:
для i в $ (netstat -atnp | awk '{print $ 7}' | grep ^ [0-9] | awk -F \ / '{print $ 1}'); do echo "PID: $ i" $ (ps faxuwwww | grep $ i); done