2015-09-14 4 views
0
for i in `ps aux | grep /usr/bin/x2goruncommand | awk '{print $1,$13;}'`; do 
server=`echo $i | cut -f1` 
port=`echo $i | cut -f2` 
su -u ${server} -c "DISPLAY:{$port}" 
done 

Я пытаюсь выполнить петлю через ps и awk. Цикл должен возвращать только 5 результатов, но в моей попытке выше результат будет равен 10. По существу моя переменная $ server возвращается в одну строку, а затем моя переменная $ port возвращается в следующей строке. Я пытаюсь запустить команду в одной строке, которая содержит как переменные $ server, так и $ port в одной строке.петля через aux и выполнить команду

Вот вывод команды пс Окс: http://i.imgur.com/USTaNEk.png

+0

Что такое 'x2goruncommand'? Что он делает со своим stdin и stdout? –

+0

возвращает все мои сеансы x2go и перечисляет пользователя и их порт отображения. Вот его вывод: http://i.imgur.com/USTaNEk.png – user1615573

+0

Для первой строки вашего 'ps aux | grep', $ 1 - «main2», а $ 13 - «51». Правильно ли это? –

ответ

1

Это может быть полезным

while read s p; 
do 
    echo $s $p; 
done < <(ps aux ...) 

заменить эхо с действием.

+0

Прохладный, что работает. Однако в моем первом цикле застрял пользователь su -c «DISPLAY =: 55 run». Как заставить его не ждать и продолжать цикл? – user1615573

+0

что делает 'run' делать? Замените 'ls' и повторите попытку. Также вы уверены, что 55 - это правильное значение для DISPLAY? – karakfa

+0

Я выполняю su -u имя пользователя -c «DISPLAY: 55 javapp», поэтому javaapp запускает java-программу, но он застрял там до тех пор, пока не будет ctrl-c, а затем он перейдет к следующему циклу. – user1615573

1

Не используйте for цикл для перебора линий - петля for используется для перебора слов. В первой итерации $ i = "main2", тогда $ i = "5114", тогда $ i = "0.0" и т. Д.

Вы хотите while read петлю

ps aux | grep /usr/bin/x2goruncommand | awk '{print $1,$13}' | 
while read server port; do 
    su -u "$server" -c "DISPLAY:$port" 
done 
Смежные вопросы