Как определить, когда была запущена фоновая задача?

372
warren

При просмотре выходных данных jobsin bashвы часто получаете список, подобный следующему:

[root@csx-tzg-sac-01 ~]# jobs [2] Running ( sleep 600 && ls -lh ~ossadmin/*.iso ) & [3]- Running ( sleep 900 && ls -lh ~ossadmin/*.iso ) & [4]+ Running ( sleep 900 && ls -lh ~ossadmin/*.iso ) & 

Можете ли вы определить, когда задание было запущено заданием (то есть, не глядя на этот пид из такого места, как ps)?

Если так, то как?

0

1 ответ на вопрос

2
Phil P

Вы можете получить идентификатор процесса задания из jobs -l, так что вы не должны охотиться через psвыход, чтобы найти работу. Вот почему вы пытались избежать ps?

jobs -l | sed 's/^\[[0-9]*\][^0-9]*\([0-9][0-9]*\)[^0-9].*/\1/' | xargs ps up 

будет работать в bash и zsh.

Если вы используете zsh, то zsh/parametersмодуль предоставляет $jobstatesпеременную массива. Например:

% echo $jobstates[1] running:-:14975=running 

Это может быть легче разобрать пид с. И если вы работаете в системе, /procтогда временная метка в директории proc сообщит вам, когда процесс был запущен.

$ ls -ld /proc/$$ 
Bash имеет `jobs -p% 1` для печати PID. grawity 13 лет назад 2
да, я пытаюсь избежать `ps`, потому что я могу или не могу привязать pid к времени запуска (возможно, выполняется полдюжины команд, которые в остальном идентичны, но разделены секундами или минутами - выбор, который может быть трудным / невозможным) warren 13 лет назад 0
Итак, мое решение работает для вас: получите pid с рабочих мест, затем запросите ps-данные для этого конкретного pid; Вы больше не ищете процесс по имени, просто ищите его. Phil P 13 лет назад 0