Invalid file type error raised when using 'does exist' and unmonitor
I have a daemon which depends on the presence of a file. If that file is present, the daemon is not started and should not be monitored either. To solve this problem, I check for the presence of the file as follows:
check process proc with pidfile /var/run/proc.pid ... depends on myfile-check check file myfile-check with path /home/checked-file if does exist then unmonitor
When the file does not exist, everything goes fine, but when it does exist monit says the file is ‘Invalid Type’, when it is just a regular empty file. The stat result on the fille:
stat /home/checked-file File: /home/checked-file Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: 16h/22d Inode: 365 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2020-09-09 09:48:16.000000000 +0000 Modify: 2020-09-09 09:48:16.000000000 +0000 Change: 2020-09-09 09:48:16.000000000 +0000 Birth: -
The monit status is:
File 'myfile-check' status Invalid type monitoring status Monitored monitoring mode active on reboot start permission - uid - gid - size - access timestamp - change timestamp - modify timestamp - data collected Wed, 09 Sep 2020 09:01:48
From the monit output, I obtained the following log:
Sep 9 17:10:22 monit[6595]: 'myfile-check' seeking to the end of the file Sep 9 17:10:22 monit[6595]: 'myfile-check' file exists Sep 9 17:10:22 monit[6595]: 'myfile-check' monitoring disabled Sep 9 17:10:22 monit[6595]: 'myfile-check' is neither a regular file nor a socket Sep 9 17:10:22 monit[6595]: 'myfile-check' trying to restart Sep 9 17:10:22 monit[6595]: 'myfile-check' stop skipped -- method not defined Sep 9 17:10:22 monit[6595]: 'myfile-check' start method not defined Sep 9 17:10:22 monit[6595]: 'myfile-check' monitoring enabled
Going into the code in validate.c in the check_file function, the file existence is firstly checked and an event is posted. In this case an unmonitor event is launched as shown in the log. However, it seems that the “s->inf.file->mode” field may be written when disabling the monitoring, and the later check “S_ISREG(s->inf.file->mode)” fails, which raises the Invalid Type event and restarts monitoring.
Comments (3)
-
-
Hello Tildeslash,
Roberto is right, a action like start/stop/unmonitor in a “exist” test will damage the collected data/status for a service.
With a closer look to the following (and all other similar checks).State_Type check_file(Service_T s) { ASSERT(s); struct stat stat_buf; : s->inf.file->timestamp.modify = stat_buf.st_mtime; for (NonExist_T l = s->nonexistlist; l; l = l->next) { Event_post(s, Event_NonExist, State_Succeeded, l->action, "file exists"); }
This works like suggested, this is the “not exist” test.
But if a "exist" check was done, the event data/status is corrupted and this data/status is used later.
for (Exist_T l = s->existlist; l; l = l->next) { rv = State_Failed; Event_post(s, Event_Exist, State_Failed, l->action, "file exists"); } } if (! S_ISREG(s->inf.file->mode) && ! S_ISSOCK(s->inf.file->mode)) { Event_post(s, Event_Invalid, State_Failed, s->action_INVALID, "is neither a regular file nor a socket"); return State_Failed; } else { Event_post(s, Event_Invalid, State_Succeeded, s->action_INVALID, "is a regular %s", S_ISSOCK(s->inf.file->mode) ? "socket" : "file"); }
And in "Event_post" the "count" is set to "1" (see below) and the "if" with "S_ISREG" and "S_ISSOCK" became true (see above).
e->state_changed = _checkState(e, state); /* In the case that the state changed, update it and reset the counter */ if (e->state_changed) { e->state = state; e->count = 1; } else { e->count++; }
You can delete the file and enable monitoring, but the status will not changed until you reload or restart the monitor.
A short overview only,
Lutzp.s.
I checked this based on Monit 5.27.0.
The "not exist" check works like expected, but "exist" does not. -
repo owner - changed status to resolved
Fixed: Issue
#931: The "if oes exist" file test with unmonitor or stop action didn't work properly.→ <<cset a737d3e3bac5>>
- Log in to comment
Hello Roberto,
nice to see, you are right, the result seems to depend to the called action.
I use similar checks to handle some application, but I start scripts in the check file statement.
The second checks work like expected, the first does not.
And the third sample works like expected too.
But, be aware, this will not stop the depend process, it disable the monitoring only.
With regards,
Lutz