Am 20.10.19 um 20:59 schrieb Dmitry Bogatov:

That sounds explainable. pidof() scans /proc directory, and it takes some
time for kernel to create entry there.

Hm, is there really a delay? I'm not very deep into kernel development, but as far as I understand /proc, it isn't populated by the kernel after a process has been created, but instead represents direct access to internal kernel data structures. So as far as I know, there shouldn't be any delay after a process has been created before it's accessible via /proc/<pid>.

Even if there were, that wouldn't explain how ps is able to see the process, while pidof is not. As far as I know, ps also gets this information from /proc.

To verify my assumptions, I've adapted my test script as follows:

#!/bin/bash

set -eu
systemctl restart apcupsd
START=$SECONDS

ps -f -C apcupsd
PID="$(ps -o pid -C apcupsd --noheaders)"
ls /proc/"$PID"

while true
do
  echo -n "pidof: "
  pidof -s apcupsd || echo
  echo -n "ls: "
  ls -d /proc/"$PID"
  [ $((SECONDS - START)) -ge 2 ] && break
  sleep 0.01
done
ps -f -C apcupsd


The output:

buster-server ~ # ./pidof.sh
UID        PID  PPID  C STIME TTY          TIME CMD
root     26476     1  0 14:16 ?        00:00:00 /sbin/apcupsd
attr clear_refs cpuset fd limits mem net oom_score personality schedstat smaps_rollup status timerslack_ns autogroup cmdline cwd fdinfo loginuid mountinfo ns oom_score_adj projid_map sessionid stack syscall uid_map auxv comm environ gid_map map_files mounts numa_maps pagemap root setgroups stat task wchan cgroup coredump_filter exe io maps mountstats oom_adj patch_state sched smaps statm timers
pidof:
ls: /proc/26476
pidof:
ls: /proc/26476
pidof:
ls: /proc/26476
pidof:
ls: /proc/26476
pidof:
ls: /proc/26476
pidof:
ls: /proc/26476
pidof: 26476
ls: /proc/26476
pidof: 26476

So the /proc/26476 is there even when pidof doesn't see the process.

But there are almost always holes in the output further on, so it's
also slightly unreliable afterwards.

This is really wierd, given that pid is same: process is not restarted.

#!/bin/bash

set -eu

systemctl restart apcupsd

Do you have receipe to reproduce issue on systemd-free box, so I can try
to debug issue myself?

Unfortunately no, I only have access to machines with systemd :(
Does replacing "systemctl restart apcupsd" with "/etc/init.d/apcupsd" work?

I had assumed that the problem should be easily reproducible with any other recently-started process, but that is apparently not the case:

buster-server ~ # cat sleep.sh
#!/bin/bash

set -eu
sleep 2 &
START=$SECONDS

ps aux|grep sleep
while true
do
  echo -n "pidof: "
  pidof -s sleep || echo
  [ $((SECONDS - START)) -ge 2 ] && break
  sleep 0.01
done
ps aux|grep sleep

Output:

buster-server ~ # ./sleep.sh
root 26946 0.0 0.0 6980 3120 pts/3 S+ 14:19 0:00 /bin/bash ./sleep.sh
root     26947  0.0  0.0   5596   752 pts/3    S+   14:19   0:00 sleep 2
root     26949  0.0  0.0   6424   884 pts/3    S+   14:19   0:00 grep sleep
pidof: 26947
pidof: 26947
pidof: 26947
pidof: 26947
pidof: 26947
[no holes like with apcupsd...]
pidof: 26947
pidof: 26947
root 26946 1.5 0.0 7112 3376 pts/3 S+ 14:19 0:00 /bin/bash ./sleep.sh
root     26947  0.0  0.0   5596   752 pts/3    S+   14:19   0:00 sleep 2
root     27069  0.0  0.0   6424   884 pts/3    S+   14:19   0:00 grep sleep

Maybe systemd is somehow involved?

--
Mit freundlichen Grüßen
Martin von Wittich

IServ GmbH
Bültenweg 73
38106 Braunschweig

Telefon: 0531-2243666-0
Fax: 0531-2243666-9
E-Mail: i...@iserv.eu
Internet: iserv.eu

USt-IdNr. DE265149425 | Amtsgericht Braunschweig | HRB 201822
Geschäftsführer: Benjamin Heindl, Martin Hüppe, Jörg Ludwig
Grundsätze zum Datenschutz: https://iserv.eu/privacy

Reply via email to