Уничтожение всего процесса команды кроме первого процесса

Прежде всего Вы не должны использовать $(echo $FRUITS) в for оператор. Используя просто $FRUITS достаточно. Затем можно покончить с одной из строк в цикле, при помощи eval.

eval просто говорит удару делать вторую оценку следующего утверждения (т.е. еще один, чем его нормальная оценка). \$ переживает первую оценку как $, и следующая оценка затем рассматривает это $ как запуск имени переменной, которое решает к "Желтому" и т.д.

Таким образом, у Вас не должно быть отдельного шага, который делает временную строку (который является тем, чему я верю, было основное намерение Вашего вопроса).

for fruit in $FRUITS ;do
    eval echo $fruit is \$${fruit}_COLOUR
done

Для альтернативного метода, как упомянуто Patrick в комментарии (выше), можно вместо этого использовать ассоциативный массив, в котором индекс элемента не должен быть целым числом. Можно использовать строку, такую как название типа фруктов. Вот пример, с помощью ассоциативного массива удара:

# This declares an associative array (It unsets it if it already exists)
declare -A colour
colour['BANANA']="Yellow"
colour["APPLE"]="Green or Red"
colour[MARTIAN ORANGE]="Blue"

for fruit in BANANA APPLE "MARTIAN ORANGE" ;do 
    echo "$fruit" is "${colour[$fruit]}"
done
3
03.01.2013, 01:19
4 ответа

Можно сделать это, например, с:

OLDEST_PID=$(pgrep -o 'DELETE OPERATION_CONTEXT')
test $OLDEST_PID && pgrep 'DELETE OPERATION_CONTEXT' | grep -vw $OLDEST_PID | xargs -r kill

Первая строка находит самый старый PID. Вторая строка проверяет сначала если $OLDEST_PID содержит что-то. Если да, это перечисляет все процессы соответствия, фильтры $OLDEST_PID и уничтожьте их (если кто-либо остается).

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

3
27.01.2020, 21:11

Ниже Примера процесса apache2 это уничтожит весь PID кроме сначала один

pgrep apache2 |awk 'NR >= 2' | xargs -n1  echo kill

если вывод вышеупомянутой команды выглядит хорошо, то можно удалить echo

3
27.01.2020, 21:11

можно испытать это:

ps -e --sort=start -o start,pid,cmd|grep <cmd>|egrep -v grep |sed 1d

это даст Вам следующий отформатированный вывод:

время начала, PID, выполняемая команда

for i in `ps -e --sort=start -o start,pid,cmd|grep <cmd>|egrep -v grep |sed 1d`
do
     kill -9 $i
done

замените уничтожение эхом сначала, чтобы гарантировать, что оно уничтожит новостей.

2
27.01.2020, 21:11

если у вас есть java crons и вы хотите проверить перед запуском этого cron, попробуйте следующее: System.out.println ("Проверка предыдущих сеансов для этого cron:" + cronname);

            String proname=ManagementFactory.getRuntimeMXBean().getName();
            String pid=proname.split("@")[0];
            System.out.println("Current PID:"+pid);

            Process proc = Runtime.getRuntime().exec(new String[]{"bash","-c"," ps aux | grep "+cronname+" | awk '{print $2}' "});

            BufferedReader stdInput = new BufferedReader(new InputStreamReader(proc.getInputStream()));
            String s = null;
            String killid="";

            while ((s = stdInput.readLine()) != null ) {                                        
                if(s.equals(pid)==false)
                {
                    killid=killid+s+" ";    
                }
            }
            System.out.println("Running PID'S except current:"+killid);

            proc.waitFor();             

            Process proc1 = Runtime.getRuntime().exec(new String[]{"bash","-c","kill -9 "+killid});
            proc1.waitFor();                

            System.out.println("Previous duplicate sessions closed for: "+cronname);        

pass cronname как ur cronname.jar

0
27.01.2020, 21:11

Теги

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