Difference between revisions of "Cron"

From Logic Wiki
Jump to: navigation, search
(Created page with "Category:Linux == Syntax == <pre> # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 -...")
 
Line 1: Line 1:
 
[[Category:Linux]]
 
[[Category:Linux]]
 +
[[Category:Fetchmail]]
 +
 
== Syntax ==
 
== Syntax ==
 
<pre>
 
<pre>
Line 21: Line 23:
 
to run a job every two, three, or four hours. That can be accomplished by dividing the hours by the desired interval, such as */3 for every three hours, or 6-18/3 to run every three hours between 6 a.m. and 6 p.m. Other intervals can be divided similarly; for example, the expression */15 in the minutes position means "run the job every 15 minutes."
 
to run a job every two, three, or four hours. That can be accomplished by dividing the hours by the desired interval, such as */3 for every three hours, or 6-18/3 to run every three hours between 6 a.m. and 6 p.m. Other intervals can be divided similarly; for example, the expression */15 in the minutes position means "run the job every 15 minutes."
 
  */5 08-18/2 * * * /usr/local/bin/mycronjob.sh
 
  */5 08-18/2 * * * /usr/local/bin/mycronjob.sh
 +
 +
 +
== in Docker ==
 +
=== dockerfile ===
 +
<pre>
 +
FROM node:11.15.0-alpine
 +
RUN apk --no-cache add fetchmail ca-certificates openrc
 +
 +
COPY scripts/fetchmail/config/cron /usr/src/fetchmail.cron
 +
RUN chmod 655 /usr/src/fetchmail.cron
 +
 +
COPY scripts/fetchmail/config/docker-entrypoint.sh /usr/src/docker-entrypoint.sh
 +
RUN chmod 655 /usr/src/docker-entrypoint.sh
 +
 +
ENTRYPOINT ["/usr/src/docker-entrypoint.sh"]
 +
 +
</pre>
 +
 +
=== scripts/fetchmail/config/cron===
 +
* * * * * node /opt/cxm/app/api/scripts/fetchmail/fetchmailrc.js
 +
=== scripts/fetchmail/config/docker-entrypoint.sh ===
 +
<pre>
 +
#!/usr/bin/env sh
 +
set -eu
 +
 +
crond -b
 +
rc-update add local default
 +
crontab /usr/src/fetchmail.cron
 +
 +
node /opt/cxm/app/api/scripts/fetchmail/fetchmailrc.js
 +
chmod 400 ~/.fetchmailrc
 +
 +
fetchmail -N -f ~/.fetchmailrc --sslcertpath /etc/ssl/certs
 +
 +
</pre>
 +
* '''crond -b''' : run in background
 +
* '''rc-update''' : add a service to runlevel
 +
* '''crontab''' : add cron to daemon
 +
* '''fetchmail.js''' : writes ~/.fetchmailrc file
 +
 +
=== ~/.fetchmailrc ===
 +
<pre>
 +
poll imap.gmail.com proto imap:
 +
  uidl # POP3 only
 +
  user "ali.iybar.inbox@gmail.com" pass "MyPassword" preconnect 'echo "$(date) fetching Email" >> /root/.fetchmail.log'
 +
  fastuidl 1 # POP3 only
 +
  keep
 +
  no rewrite
 +
  mda "node /opt/cxm/app/api/scripts/fetchmail/fetchmailmda.js --connector-id 0805fc18-be09-4219-bdae-5db919e99f75"
 +
  ssl
 +
</pre>
 +
=== fetchmailmda.js  ===
 +
Script which receives a full Mail object from an IMAP server,
 +
parses the headers, content and any attachments and prepares it for the next
 +
stage in the process (database/queuing).
 +
 +
This script is called from the `fetchmail` daemon which expects an exit code
 +
of `0`. If there are any problems processing an email, a non-zero exit code
 +
will mean that the fetchmail daemon will try again in the next pass.
 +
 +
<pre>
 +
 +
async function main() {
 +
  process.stdin.resume();
 +
  process.stdin.setEncoding('utf8');
 +
  const source = process.stdin;
 +
 +
  const mail = await simpleParser(source);
 +
  const mailPayload = toEmailPayload(mail);
 +
...
 +
const name = parseFullName(get(mailPayload, 'from[0].name', ''));
 +
 +
</pre>
 +
 +
it gets the email, parse and use the parsed payloads to save it

Revision as of 11:51, 25 November 2021


Syntax

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

Scheduling Tricks

every Thursday at 3 p.m

00 15 * * Thu /usr/local/bin/mycronjob.sh

quarterly reports after the end of each quarter (use the first day of the following month)

02 03 1 1,4,7,10 * /usr/local/bin/reports.sh

one minute past every hour between 9:01 a.m. and 5:01 p.m.

01 09-17 * * * /usr/local/bin/hourlyreminder.sh

to run a job every two, three, or four hours. That can be accomplished by dividing the hours by the desired interval, such as */3 for every three hours, or 6-18/3 to run every three hours between 6 a.m. and 6 p.m. Other intervals can be divided similarly; for example, the expression */15 in the minutes position means "run the job every 15 minutes."

*/5 08-18/2 * * * /usr/local/bin/mycronjob.sh


in Docker

dockerfile

FROM node:11.15.0-alpine
RUN apk --no-cache add fetchmail ca-certificates openrc

COPY scripts/fetchmail/config/cron /usr/src/fetchmail.cron
RUN chmod 655 /usr/src/fetchmail.cron

COPY scripts/fetchmail/config/docker-entrypoint.sh /usr/src/docker-entrypoint.sh
RUN chmod 655 /usr/src/docker-entrypoint.sh

ENTRYPOINT ["/usr/src/docker-entrypoint.sh"]

scripts/fetchmail/config/cron

* * * * * node /opt/cxm/app/api/scripts/fetchmail/fetchmailrc.js

scripts/fetchmail/config/docker-entrypoint.sh

#!/usr/bin/env sh
set -eu

crond -b
rc-update add local default
crontab /usr/src/fetchmail.cron

node /opt/cxm/app/api/scripts/fetchmail/fetchmailrc.js
chmod 400 ~/.fetchmailrc

fetchmail -N -f ~/.fetchmailrc --sslcertpath /etc/ssl/certs

  • crond -b : run in background
  • rc-update : add a service to runlevel
  • crontab : add cron to daemon
  • fetchmail.js : writes ~/.fetchmailrc file

~/.fetchmailrc

poll imap.gmail.com proto imap:
  uidl # POP3 only
  user "ali.iybar.inbox@gmail.com" pass "MyPassword" preconnect 'echo "$(date) fetching Email" >> /root/.fetchmail.log'
  fastuidl 1 # POP3 only
  keep
  no rewrite
  mda "node /opt/cxm/app/api/scripts/fetchmail/fetchmailmda.js --connector-id 0805fc18-be09-4219-bdae-5db919e99f75"
  ssl

fetchmailmda.js

Script which receives a full Mail object from an IMAP server, parses the headers, content and any attachments and prepares it for the next stage in the process (database/queuing).

This script is called from the `fetchmail` daemon which expects an exit code of `0`. If there are any problems processing an email, a non-zero exit code will mean that the fetchmail daemon will try again in the next pass.

 

async function main() {
  process.stdin.resume();
  process.stdin.setEncoding('utf8');
  const source = process.stdin;

  const mail = await simpleParser(source);
  const mailPayload = toEmailPayload(mail);
...
const name = parseFullName(get(mailPayload, 'from[0].name', ''));

it gets the email, parse and use the parsed payloads to save it