Извините за этот выстрел цветного экрана, но я думаю, что он помогает выделить проблему лучше, чем копия и вставка + формат кода:
Вот тот же экран в формате кода:
───────────────────────────────────────────────────────────────────────────────
rick@dell:~$ ps a | grep display-
26457 pts/2 S+ 0:00 grep --color=auto display-
───────────────────────────────────────────────────────────────────────────────
rick@dell:~$ ps a | grep display-
28927 pts/18 S+ 0:00 sudo /usr/local/bin/display-auto-brightness
29174 pts/18 S+ 0:00 /bin/bash /usr/local/bin/display-auto-brightness
30183 pts/2 S+ 0:00 grep --color=auto display-
───────────────────────────────────────────────────────────────────────────────
rick@dell:~$ pstree | grep display-
|-cron---cron---sh---display-auto-br---sleep
| | | | |-bash---sudo---display-auto-br---sleep
───────────────────────────────────────────────────────────────────────────────
rick@dell:~$ ps a | grep cron
16031 pts/2 S+ 0:00 grep --color=auto cron
───────────────────────────────────────────────────────────────────────────────
rick@dell:~$ ps a | grep display
26773 pts/2 S+ 0:00 grep --color=auto display
28927 pts/18 S+ 0:00 sudo /usr/local/bin/display-auto-brightness
29174 pts/18 S+ 0:00 /bin/bash /usr/local/bin/display-auto-brightness
───────────────────────────────────────────────────────────────────────────────
Этим утром после перезагружают задание крона - /etc/cron.d/display-auto-brightness
должен был запустить. Я думал, что это никогда не запускалось на, он идет на основе первого раздела.
Я вручную запустил сценарий с sudo /usr/local/bin/display-auto-brightness
. Второй раздел показывает как ps
возвраты два идентификатора процесса для единственного задания. Oncefor sudo
повышение, которое запустило задание и второе для самого сценария.
Существует ли программный способ идентифицировать эти два PIDs как одно задание? Так как причиной является следующий шаг разработки, когда возобновление от приостанавливает, чтобы видеть, выполняет ли единственное задание (не два процесса) уже и уничтожает его при запуске того же задания снова. Это даст моментальную настройку яркости дисплея при возобновлении при свете дня после приостановки в темноте или наоборот.
В третьем разделе я использовал pstree
управляйте и обнаруженный задание крона, которое не появилось с ps
команда показывает здесь. Почему это?.
В четвертом разделе я передаю по каналу ps
вывод через grep
использование cron
поскольку фильтр и ничто обнаруживаются. Почему это?
В пятом и заключительном разделе я повторяю второй раздел ps a | grep display-
вновь подтвердить предыдущие результаты.
Редактирование 1
Я думаю, что выяснил, почему четвертый раздел не показывает cron
выполнение. Это из-за состояния обычного пользователя, пока крон работает как корень. Решение состоит в том, чтобы использовать:
$ sudo ps aux | grep cron
root 1122 0.0 0.0 29008 2936 ? Ss 04:16 0:00 /usr/sbin/cron -f
rick 7273 0.0 0.0 14224 1028 pts/2 S+ 17:50 0:00 grep --color=auto cron
Теперь мы видим, что исходная перезагрузка в 4:16 все еще работает под заданием крона. Идентификатор 1122 процесса мог бы быть тем, который должен быть уничтожен, когда возобновление от приостанавливает в будущих изменениях программы. Это все еще не набрасывается на название сценария display-auto-brightness
который pstree
команда находит.
При установке значка для вызова сценария удара от рабочего стола Windows 10 Вы получаете более запускающие программы, чем под плоскостью Ubuntu 16.04 и Единица:
$ ps -ef | grep lock-screen
rick 29243 29242 0 17:13 tty1 00:00:00 /bin/bash -c cd && DISPLAY=0:0 /mnt/e/bin/lock-screen-timer
rick 29244 29243 0 17:13 tty1 00:00:00 /bin/bash /mnt/e/bin/lock-screen-timer
Когда Вы используете pstree
существует еще больше PID:
$ pstree -gp | grep lock-screen
|-init(29242,29242)---bash(29243,29242)---lock-screen-tim(29244,29242)---sleep(29777,29242)
В "старом" методе я уничтожил бы lock-screen-timer
"29244". Взгляд на ps -aux
Я думаю, что должен уничтожить "29243". Взгляд на pstree
хотя init
родительский процесс должен быть уничтожен, который является "29242".
init
PIDЭтот снимок экрана показывает, как Вы не можете уничтожить init
PID непосредственно. Можно уничтожить, это - ребенок, который заставляет это умирать, но внук и правнук продолжают бежать. Казалось бы, что необходимо уничтожить три PID в соответствии с Windows 10 WSL, когда настольный ярлык используется:
rick@alien:/mnt/c/Windows/System32$ pstree -gp | grep lock-screen
|-init(30554,30554)---bash(30555,30554)---lock-screen-tim(30556,30554)---sleep(30587,30554)
rick@alien:/mnt/c/Windows/System32$ kill 30554
-bash: kill: (30554) - Operation not permitted
rick@alien:/mnt/c/Windows/System32$ sudo kill 30554
[sudo] password for rick:
rick@alien:/mnt/c/Windows/System32$ pstree -gp | grep lock-screen
|-init(30554,30554)---bash(30555,30554)---lock-screen-tim(30556,30554)---sleep(30587,30554)
rick@alien:/mnt/c/Windows/System32$ kill 30555
rick@alien:/mnt/c/Windows/System32$ pstree -gp | grep lock-screen
|-lock-screen-tim(30556,30554)---sleep(30612,30554)
rick@alien:/mnt/c/Windows/System32$ pstree -gp | grep sleep
|-lock-screen-tim(30556,30554)---sleep(30633,30554)
rick@alien:/mnt/c/Windows/System32$ kill 30556
rick@alien:/mnt/c/Windows/System32$ pstree -gp | grep sleep
`-sleep(30633,30554)
rick@alien:/mnt/c/Windows/System32$ kill 30633
Благодаря этому Q& (, как уничтожить задание крона если это doesn' t показывают в PS? или заставьте это показывать в PS? ), я был установлен на правильном пути:
───────────────────────────────────────────────────────────────────────────────
rick@dell:~$ ps wwuxa |grep display-auto | grep -v grep
root 1584 0.0 0.0 4508 780 ? Ss 14:02 0:00 /bin/sh -c /usr/local/bin/display-auto-brightness
root 1592 0.0 0.0 12564 2984 ? S 14:02 0:00 /bin/bash /usr/local/bin/display-auto-brightness
───────────────────────────────────────────────────────────────────────────────
rick@dell:~$ pstree -p -g | grep display-auto
|-cron(1376,1376)---cron(1436,1376)---sh(1584,1584)---display-auto-br(1592,1584)---sleep(16989,1584)
───────────────────────────────────────────────────────────────────────────────
rick@dell:~$
крон Уничтожения (с 1376 и 1436 pid) является, вероятно, плохой идеей. Однако уничтожая оболочку удара (1584), который является родителем к автоматическая яркость дисплея (1592) и прародитель к , сон (16989) должен уничтожить ребенка и внука. Затем две копии дочернего процесса (автоматическая яркость дисплея) не будут работать одновременно.
Теперь прибывает проблема программирования сценария, но по крайней мере теперь я знаю, как извлечь информацию.
Так как Вы хотите найти только PIDs выполнения процесса и ничто косвенно связанное (т.е. PID эти sudo
вызов, и grep
поиск имени процесса), Вы можете просто grep незаконные слова от начального поиска.
$ ps aux | grep display-auto-brightness | grep -vw -e grep -e sudo | awk '{print $2}'
Эффективно, да, существует способ идентифицировать их как единственный процесс, но с условием.
Предположим, что у нас есть это:
#!/bin/bash
loop_function(){
while :
do
sleep 3
done
}
loop_function &
while true
do
sleep 3
done
И мы запускаем его в фоне:
bash-4.3$ ./simple_example.sh &
[1] 16180
Здесь мы видим, что сам сценарий имеет 16 180 PID. У всех его детей был бы другой. Теперь, у всех них есть общий родитель: оболочка, которая указана в #!
строка, т.е. что точно тот же самый PID, о котором сообщили, когда мы выполнили сценарий в фоне. Таким образом, при помощи ps
с определением ppid
, мы можем искать все процессы, принадлежащие тому же процессу.
bash-4.3$ ps -e -o ppid,command | grep 16180 | grep -v grep
16180 /bin/bash ./simple_example.sh
16180 sleep 3
Теперь, очевидно, это подразумевает две вещи:
Что касается pstree
часть вопроса, задание действительно появлялось там - это было просто отключено grep
. Вам также не нужно sudo
для просмотра cronjobs:
$ ps -ef | grep cron | grep -v grep && echo $USER
root 896 1 0 09:47 ? 00:00:00 /usr/sbin/cron -f
xieerqi