Updated: 2015-03-11 14:28 EDT
process_id.sh
signaltrap.sh
temperature.sh
mail
command – mail_temperature.sh
crontab
at
Do not print this assignment on paper!
- On paper, you will miss updates, corrections, and hints added to the online version.
- On paper, you cannot follow any of the hyperlink URLs that lead you to hints and course notes relevant to answering a question.
- On paper, scrolling text boxes will be cut off and not print properly.
23h59 (11:59pm) Friday March 13, 2015 (End of Week 9)
Do not print this assignment on paper! On paper, you cannot follow any of the hyperlink URLs that lead you to hints and course notes relevant to answering a question.
crontab
, and at
.This is an overview of how you are expected to complete this assignment. Read all the words before you start working.
For full marks, follow these directions exactly.
You will create file system structure in your HOME directory on the CLS, with various directories, files, and links. When you are finished the tasks, leave these files, directories, and links in place as part of your deliverables on the CLS. Do not delete any assignment work until after the term is over! Assignments may be re-marked at any time; you must have your term work available right until term end.
All references to the Source Directory below are to the CLS directory ~idallen/cst8177/15w/assignment06/
and that name starts with a tilde character ~
followed by a user name with no intervening slash. The leading tilde indicates to the shell that the pathname starts with the HOME directory of the account idallen
(seven letters).
You do not have permission to list the names of all the files in the Source Directory, but you can access any files whose names you already know.
The previous term’s course notes are available on the Internet here: CST8207 GNU/Linux Operating Systems I. All the notes files are also searchable on the CLS. You can recall how to read and search these files using the command line on the CLS under the heading Copies of the CST8207 course notes near the bottom of the page Course Linux Server Course Notes.
Some of the tasks below ask you to write a small executable shell script, based on the lecture notes and slides. None of the scripts need Boolean expressions (“||
” or “&&
” or -a
or -o
); they are all simple scripts with simple conditional logic.
Each script below must begin with the Standard Script Header you used for your previous script assignments. See the class notes.
Some scripts contain simple one-line pipelines. You can first create these pipelines on the command line, get them working correctly, then copy the working pipeline into the script file when it works. It is much faster to test and fix the pipeline on the command line instead of editing and saving the script file over and over.
Though the header is executable code, in the descriptions below we don’t count those lines, or any comment or blank lines, in the size of the script. We only count the new lines of code that you write.
For example, a “two-line script” is really several lines of header, a blank line, a block of several comment lines that Document Your Script, another blank line, and then your two lines of actual script code. The description below calls this a two line script, even though it may contain a dozen lines.
When you have completed each script, ensure that it is executable, so that it can be executed as ./scriptname.sh
from the shell command line.
Run the given tests on your scripts to make sure they work. Sample output for each of the scripts is given, so that you may check your work as you proceed.
Make sure your script handles all of the sample inputs given, especially the inputs containing shell metacharacters. (System crackers often attack your system using special characters as input.)
Scripts must validate their arguments, even if they take no arguments. (A script that takes no arguments must not run if you give it arguments, since clearly you don’t know how to use it.) Error messages must be written in the style of Good Error Message, as you did in the previous assignment. Always follow the Good Error Message with a Usage message that says how the script should be run.
Scripts that have usage errors should exit with a non-zero exit code, indicating something went wrong.
The examples below do not fully test your script; you will need to try other examples to make sure your scripts work properly for all possible inputs. Always test your scripts with quoted shell GLOB pattern arguments to make sure they don’t expand inside the script.
When your script is working, Document Your Script as you did in the previous assignment.
For full marks, follow these task directions below exactly as written. READ ALL THE WORDS to work effectively and not waste your time.
Do a Remote Login to the Course Linux Server (CLS) from any existing computer, using the host name appropriate for whether you are on-campus or off-campus. All work in this assignment must be done on the CLS.
Base Directory: Make the CLS Base Directory named ~/CST8177-15W/Assignments/assignment06
, in which you will create the files for the following tasks.
This CLS assignment06
directory is the Base Directory for most pathnames in this assignment. Store your files and answers in this Base Directory on the CLS.
Create the check
symbolic link needed to run the Checking Program, as described in the section Checking Program below.
Use the symbolic link to run the Checking Program to verify your work so far.
Check your work so far using the checking program symlink.
process_id.sh
- Before you write any scripts, re-read the above section with the title Review of How To Write and Test Scripts.
- The material from last term on Processes and Jobs may be useful.
Using the specifications below, write an executable script named process_id.sh
that shows information about processes that are owned by a given user name and have a given command name. Use the Hints below to help you.
The process_id.sh
script must start with the correct Script Header lines.
./process_id.sh
user_name
command_name
The script must print zero or more lines containing process information about every process with the given command_name
owned by the given user_name
(if any).
The script should show only lines for processes owned by the given user_name
and with the given command_name
.
The script must not show any lines for partial user names such as roo
or oot
or partial command names such as bas
or ash
. Both names given by the user must match fully in the output of ps
.
The script must print a Good Error Message and Usage message if it doesn’t receive exactly two command line arguments, and exit with an exit status of 2
.
The script does not have to validate the user name or produce any error message if no lines of output are generated. Failing to match any processes is not an error.
When your script is working, Document Your Script as you did in the previous assignment.
process_id.sh
Your output and numbers will differ.
$ ./process_id.sh "$USER" process_id.sh
abcd0001 9170 0.0 0.0 4400 612 pts/2 S+ 10:25 0:00 /bin/sh -u ./process_id.sh abcd0001 process_id.sh
$ ./process_id.sh "$USER" bash
abcd0001 1647 0.0 0.0 26344 2740 pts/2 Ss Oct22 0:00 -bash
$ ./process_id.sh "$USER" sshd
abcd0001 1643 0.0 0.0 90508 1308 ? S Oct22 0:02 sshd: abcd0001@pts/2
$ ./process_id.sh root cron
root 3574 0.0 0.0 19112 860 ? Ss Oct22 0:03 cron
$ ./process_id.sh root sshd | wc -l
10 # should find at least two
$ ./process_id.sh oot sshd | wc -l
0 # no such user name
$ ./process_id.sh roo sshd | wc -l
0 # no such user name
$ ./process_id.sh sshd sshd | wc -l
0 # no such user name
$ ./process_id.sh www apache2 | wc -l
0 # no such user name
$ ./process_id.sh root s | wc -l
0 # no such process name
$ ./process_id.sh sshd root | wc -l
0 # no such user or process
$ ./process_id.sh '*' '*' | wc -l
0 # no such user or process
$ ./process_id.sh one
./process_id.sh: Expecting two arguments, found 1 (one)
Usage: ./process_id.sh user_name command_name
$ ./process_id.sh one two three
./process_id.sh: Expecting two arguments, found 3 (one two three)
Usage: ./process_id.sh user_name command_name
process_id.sh
The script will use the ps
command and a pipeline of one or more commands to select only those ps
output lines that match the given user name and command name.
Refer to your previous assignment work on process listings from Assignment #02: Creating a script
The active part of the script will be one line long (a pipeline). A perfect solution needs only two commands separated by one pipe.
That one line will be preceded by code to check the number of arguments (two arguments), plus some lines for the Script Header. As with many one-line scripts, the code needed to check the arguments greatly exceeds the code that does useful work!
Do not use any options to ps
that show all processes! You cannot easily search the resulting output for a command name.
ps
options described next:
ps
command has a useful option to display only processes with a particular command name. Using this option to select only lines that contain that command name makes the script much simpler, since otherwise it is tricky to use grep
to match a command name in the middle of a line of ps
output. If you don’t use this option to ps
you must select the command name carefully by choosing some surrounding context from the output lines using grep
. I recommend using the ps
option, not grep
.ps
generate a user name at the start of every output line. See the man page for either the full-format or user-oriented output format. Once you make ps
select lines that have the right command name, using grep
to select lines containing only the correct user name is easy since the user name field can always be matched as anchored at the start of every line. Do not match any user name that might occur later in the line. Do not match partial user names, e.g. roo
or www
.Do not use the ps
option that searches for a user name: You cannot combine the above ps
option that searches for a command name with a ps
option to also search for a user name, since the result will be processes that match a command name or that match the user name, not processes that match both. Use only the above two ps
options in your solution.
Make sure that when you search for a user name in the output of ps
that you use a pattern that ensures that the entire user name is matched and not just a prefix or a suffix. The script must not show any lines for partial user names such as roo
or oot
.
Do not print lines from ps
that look like command names. Carelessly written scripts will incorrectly print the grep
command that is being used to select the right ps
output line inside the script; don’t do that. Show only the required output. (If you use the correct ps
options, you won’t have this problem.)
Test your script and verify that all the Examples work.
Run the Checking Program to verify your work so far.
signaltrap.sh
Let’s use the above script to find a process and then send it some signals.
We are going to be running a shell background process for this test. Normally, the shell won’t tell you anything about your background processes until you push the Enter key and get a shell prompt. To get immediate notification, set the
notify
shell option as described in last term’s Login and Shell Startup Files.
signaltrap_output
signaltrap.sh
which is located in the Source Directory. You’ll notice this script starts and doesn’t finish – it just sits there doing nothing, and you don’t get your bash
prompt back because the script isn’t finished yet. The bash
prompt won’t appear until the script process is finished, killed, or stopped.
signaltrap_output
. Do not delete this log file.^C
to try to interrupt this script process.
^C
at a keyboard sends the foreground process an INT
(interrupt) signal. Most processes die when they receive an interrupt signal.signaltrap.sh
process did not do the normal thing (die) upon receiving the INT
signal. It “caught” the signal, printed and logged a message, and refused to die.^Z
at the keyboard to send a STOP
signal to the signaltrap.sh
process.
bash
prompt back and see a message about the process being Stopped
by the signal.jobs
command will list this as a Stopped
process.bg
to resume the script process running in the background.
process_id.sh
script from above to find the process id of this background script process.
process_id.sh
script can’t find signaltrap.sh
you may need to adjust it to find commands that are shell scripts. (This may be tricky if you aren’t using the ps
option described in the Hints for the ./process_id.sh
script.)signaltrap.sh
script process a TERM
signal (terminate) and notice that this too didn’t make the process do the expected terminate action (clean up and die).
trap
.signaltrap.sh
process a KILL
signal.
KILL
signals can’t be ignored, so it should be gone – verify this.jobs
command will show that the process is gone.KILL
signal?PID
of any process owned by root
or by another user, and try sending it a KILL
signal (or any other signal).
Operation not permitted
error message.signaltrap.sh
log file, below all the other log messages. Do not accidentally erase the messages in the log file!Run the Checking Program to verify your work so far.
temperature.sh
- Before you write any scripts, re-read the above section with the title Review of How To Write and Test Scripts.
- The material from last term on Examples of Pipes may be useful.
Using the specifications below, write an executable script named temperature.sh
that extracts the current Ottawa Temperature from the appropriate Environment Canada XML RSS page. Use the Hints below to help you.
The temperature.sh
script must start with the correct Script Header lines.
The script will accept no arguments.
The script will print one line containing the current Ottawa Temperature, e.g. Temperature: 6.4°C
The script must print a Good Error Message and Usage message if it receives any command line arguments, and exit with an exit status of 2
.
otemp
Create a hard link to the temperature.sh
script in your own bin/
directory and name the link otemp
otemp
at a shell prompt to have the one line of current temperature display.
PATH
in your .bashrc
as required in Section 4.3 of Assignment #02?When your script is working, Document Your Script as you did in the previous assignment.
temperature.sh
Your output will differ.
$ ./temperature.sh
Temperature: 6.4°C
$ otemp
Temperature: 6.4°C
$ ./temperature.sh one two three
./temperature.sh: Not expecting any arguments, found 3 (one two three)
Usage: ./temperature.sh
$ otemp one two
/home/abcd0001/bin/otemp: Not expecting any arguments, found 2 (one two)
Usage: /home/abcd0001/bin/otemp
temperature.sh
Start by building up the working command pipeline on your interactive command line. Get it working on the command line before you copy the working pipeline into your shell script.
Refer to last term’s work with pipes and web pages shown in CST8207 Examples of Pipes and scroll down to the Display current Ottawa weather temperature example that fetches the temperature using an elinks
alias and the Environment Canada XML RSS feed.
elinks
with the given options (reproduced below) to retrieve the current Ottawa temperature from the given XML RSS feed URL
:
elinks -dump -no-numbering -no-references
URL
URL
should be the Ottawa XML RSS feed as shown in the above example.URL
.elinks
command and arguments in the pipeline, not a shell alias. Shell aliases may make the script harder to read.elinks
output into fgrep
to extract the line containing the text string Temperature:
from the XML RSS page.
Temperature: 6.4°C
fgrep
command line.fgrep
pattern, e.g. “Temp”, since that might match other lines in the RSS output some day, e.g. “Abnormal Temperature Trend”.temperature.sh
that prints out the current temperature for Ottawa.
alias
in your script; use the full elinks
command line with the correct URL
.
URL
contains shell meta-characters, such as ?
, you must quote the URL
to prevent GLOB expansion by the shell..
URL
from the shell.elinks
defaults to fetching pages using the UTF8 character set, which may not display well on your screen.
elinks
-dump-charset
option followed by the name of a new character set. (Try the names ascii
, latin1
or the default utf8
.)If the degree special character between the temperature number and the letter C
doesn’t display correctly under Windwos (e.g. 6.4°C
), you may need to reconfigure PuTTY for the UTF8 character set. (Remember to save your PuTTY settings.)
Test your script and verify that all the Examples work.
Run the Checking Program to verify your work so far.
mail
command – mail_temperature.sh
System administrators often have systems send them automated EMail. You will build a script that uses EMail to send you the Ottawa temperature. (You can optionally send the temperature to your mobile phone.)
- There are many text-mode EMail clients (“Mail User Agents”) for Linux. This assignment uses the one named
- Optional: If you are interested in trying a power-user text-mode mail client for everyday interactive use, try
mutt
and readman mutt
on the CLS.
mail
command, and try sending yourself EMail from the CLS to your own EMail account using this pipeline:
$ echo "Testing mail" | mail -s "Test"
abcd0001
@algonquinlive.com
$ who | mail -s 'See who list'
abcd0001
@algonquinlive.com
abcd0001
with your own Algonquin Live EMail address, or use your own personal EMail address instead.mail
program; try replacing the command on the left of the pipe with ls
or date
or any command that generates standard output that you can redirect.temperature.sh
weather script to your Algonquin EMail address with the subject: Current Ottawa Temperature
C
doesn’t display correctly in your EMail (e.g. 6.4°C
), read the Hints above about option -dump-charset
.mail_temperature.sh
that will use your temperature.sh
script and the above EMail syntax to send the current Ottawa temperature to your Algonquin EMail address. (Use the working command line from above.)
temperature.sh
script to generate the one line of temperature data for the script pipeline.elinks
line inside this new mail script; your new script must EMail the output created by running your temperature.sh
script (that contains the elinks
line).temperature.sh
script. (Of course, you won’t be able to fully test it without a working temperature.sh
script.)omt
mail_temperature.sh
script in your own bin/
directory and name the link omt
(Ottawa Mail Temperature).
omt
at a shell prompt to have the temperature sent to you by EMail. (If this command isn’t found, re-read the note about PATH
above in the temperature script section.)Run the Checking Program to verify your work so far.
- Optional: You can try finding and using an SMS Gateway List to find the EMail address of your SMS enabled phone, and EMail any text message from the CLS directly to your phone. (May be subject to length restrictions and incur an arbitrary delay.)
- If the degree special character between the temperature number and the letter
C
doesn’t display correctly in your EMail (e.g.6.4°C
), read the Hints above about option-dump-charset
.
crontab
You may find last term’s notes Crontab and At Jobs useful here.
The
crontab
command is used to create tasks that are run repeatedly by the systemcron
daemon program. These are commonly calledcron
jobs. You can create personalcron
jobs. There is also a system file containing systemcron
jobs that only the super-user can edit.
If you don’t redirect all the output of command lines used in a cron
job, any output will be sent to you by EMail. You will need to use the mail
program to read the EMailed output generated by your cron
jobs. Learn about EMail on the CLS.
Read the course notes and the skim the man page for the crontab
command. You may find last term’s notes Crontab and At Jobs useful here.
Run the CLS command select-editor
to choose a text editor for use by the crontab
command. (Isn’t it time you learned some vim
?)
crontab -e
to start the selected text editor to edit your personal crontab
file.
crontab
file opens in the text editor with a list of helpful comments, but no actual commands are scheduled.crontab
commands to the bottom of the file, below the comments. The commands you add will not take effect until after you save the file and exit the text editor.crontab
line that runs in the near future to make sure you know how cron
jobs work: e.g. create a crontab
line that runs the date
command every minute, save, and exit. Wait a minute for the command to execute.date
output will be sent. Learn about EMail on the CLS.crontab
command again to edit and experiment with other valid crontab
lines that run in the near future, e.g. two minutes from now, etc.crontab
command to remove the test commands from your personal crontab
when you know enough about how to create working cron
jobs.crontab
line designed to run your omt
program (located in your bin/
directory) at The Crontab Time.
omt
program in your bin/
directory.crontab
using times in the near future while you are testing your cron
job to make sure it works.crontab
file correctly even if you have not got a working omt
script. (Of course you won’t receive the correct output without a working omt
script.)Use the crontab
command with option that lists the contents of your current live crontab
file. Make sure your displayed cron
job is scheduled at The Crontab Time.
omt.crontab
crontab
file into an omt.crontab
text file in the Base Directory. (It should contain one valid crontab
line at the bottom of all the comments.)In your cron
job, did you use a relative path to the omt
script name (the name that is located in your own bin/
directory)? You need to know in which directory the cron
job runs, to create the correct relative path to the program in your bin/
directory.
Run the Checking Program to verify your work so far.
How to calculate your personal crontab time for use in cron and at jobs.
- Take your 9-digit student number and remove the first three digits (probably
040
), leaving six digits. Use these six digits as follows:- Take the first two of those six digits as a number, modulo 12, and then add 1, giving a number between 1 and 12. This is your month number.
- Take the next (middle) two of those six digits as a number, modulo 24, giving a number between 0 and 23. This is your hour number.
- Take the last two of those six digits as a number, modulo 60, giving a number between 0 and 59. This is your minute number.
- Take the same last two of those six digits as a number, modulo 28, and then add 1, giving a number between 1 and 28. This is your day-of-the-month number.
For example, if your nine-digit student number were 123456789
, the last six digits would be 45 67 89
and:
(45%12)+1 = 10
67%24 = 19
89%60 = 29
(89%28)+1 = 6
Example result for student number 123456789
: October 6 at 19h29 (7:29pm).
at
You may find last term’s notes Crontab and At Jobs useful here.
The
at
command is used to create a task that runs only once at some future date and time. These are commonly calledat
jobs. There is no system file ofat
jobs, since these jobs only run once.
If you don’t redirect all the output of command lines used in an at
job, any output will be sent to you by EMail. You will need to use the mail
program to see the EMailed output generated by your at
jobs. Learn about EMail on the CLS.
at
command and note the syntax used to schedule an at
job at a time and date in the future. Experiment with some at
command lines that run in the near future to make sure you know how it works. You may find last term’s notes Crontab and At Jobs useful here.at
command to schedule a run of your omt
program (located in your bin/
directory) at The Crontab Time in the year 2016.
omt
program in your bin/
directory.at
command to make sure it works.at
job correctly even if you have not got a working omt
script. (Of course you won’t receive the correct output without a working omt
script.)at
job numbers and display the list to make sure your job is scheduled to run at The Crontab Time in 2016.In your at
job, did you use an absolute path to the omt
script name (the name is located in your own bin/
directory)?
at
jobsYou may forget what command is scheduled in a job. What is the command syntax to show you the content of a scheduled at
job, not just the job number? (NOTE: The command that lists all your at
job numbers is not the same as the command that shows you what the content of the job actually is!)
In other words, use a command to display the actual command line that you submitted when you created the at
job, along with all the environment information that the system adds to your at
job.
atjob.txt
at
job and redirect it into file atjob.txt
in your base directory. The file should start with a shebang line and contain about 30 lines (approximately), most of which are variable assignment statements.Usually we don’t care to see all the environment information at the start of the queued
at
job file. Assuming that the command being run byat
is only one line long (as it is for our 2016 job), you can show only the one-line command line itself on your screen and not see all of the associated shell environment that is created as part of the job by piping the output into a command that shows the last lines of input.
Run the Checking Program to verify your work so far.
That is all the tasks you need to do.
Read your CLS Linux EMail and remove any messages that may be waiting. See Reading eMail for help.
Check your work a final time using the Checking Program below and save the standard output of that program into a file as described below. Submit that file (and only that one file) to Blackboard following the directions below.
When you are done, log out of the CLS before you close your laptop or close the PuTTY window, by using the shell exit
command:
$ exit
Summary: Do some tasks, then run the Checking Program to verify your work as you go. You can run the Checking Program as often as you want. When you have the best mark, upload the single file that is the output of the Checking Program to Blackboard.
Since I also do manual marking of student assignments, your final mark may not be the same as the mark submitted using the current version of the Checking Program. I do not guarantee that any version of the Checking Program will find all the errors in your work. Complete your assignments according to the specifications, not according to the incomplete set of the mistakes detected by the Checking Program.
There is a Checking Program named assignment06check
in the Source Directory on the CLS. Create a Symbolic Link to this program named check
under your new Base Directory on the CLS so that you can easily run the program to check your work and assign your work a mark on the CLS. Note: You can create a symbolic link to this executable program but you do not have permission to read or copy the program file.
Execute the above check
program on the CLS using its symbolic link. (Review the Search Path notes if you forget how to run a program by pathname from the command line.) This program will check your work, assign you a mark, and display the output on your screen. (You may want to paginate the long output so you can read all of it.)
You may run the check
program as many times as you wish, to correct mistakes and get the best mark. Some task sections require you to finish the whole section before running the checking program at the end; you may not always be able to run the checking program successfully after every single task step.
When you are done with this assignment, and you like the mark displayed on your screen by the Checking Program, you must redirect only the standard output of the Checking Program into the text file assignment06.txt
in your Base Directory on the CLS.
YOUR MARK for
assignment06.txt
(containing the output from the Checking Program) from the CLS to your local computer.
YOUR MARK for
assignment06.txt
file from your local computer to the correct Assignment area on Blackboard (with the exact name) before the due date:
Use only Attach File on the Upload Assignment page. Do not enter any text into the Text Submission or Comments boxes on Blackboard; I do not read them. Use only the Attach File section followed by the Submit button. If you need to comment on any assignment submission, send me EMail.
You can revise and upload the file more than once using the Start New button on the Review Submission History page to open a new Upload Assignment page. I only look at the most recent submission.
You must upload the file with the correct name from your local computer; you cannot correct the name as you upload it to Blackboard.
You will also see the Review Submission History page any time you already have an assignment attempt uploaded and you click on the underlined assignment06 link. You can use the Start New button on this page to re-upload your assignment as many times as you like.
You cannot delete an assignment attempt, but you can always upload a new version. I only mark the latest version.
Your instructor may also mark files in your directory in your CLS account after the due date. Leave everything there on the CLS. Do not delete any assignment work from the CLS until after the term is over!
I do not accept any assignment submissions by EMail. Use only the Blackboard Attach File. No word processor documents. Plain Text only.
Use the exact file name given above. Upload only one single file of Linux-format plain text, not HTML, not RTF, not MSWord. No fonts, no word-processing. Linux plain text only.
NO EMAIL, WORD PROCESSOR, PDF, RTF, or HTML DOCUMENTS ACCEPTED.
No marks are awarded for submitting under the wrong assignment number or for using the wrong file name. Use the exact 16-character, lower-case name given above.
WARNING: Some inattentive students don’t read all these words. Don’t make that mistake! Be exact.
READ ALL THE WORDS. OH PLEASE, PLEASE, PLEASE READ ALL THE WORDS!