Introduction
JS7 offers a number of JS7 - Job Classes including JS7 - Java Jobs, JS7 - JavaScript Jobs and Shell Jobs.
- Shell Jobs are started from an OS process by the JS7 Agent
- Any number of instances of a Shell Job can be executed in parallel.
JS7 - Job Environment Variables are available to Shell Jobs.
Using Script Languages
Shell jobs execute job scripts in any scripting language available from the OS.
Unix
Running Shell Scripts
Shell scripts can be written in any Shell available from the OS such as bash, ksh, zsh, dash etc. It is recommended to add a shebang to the first line of the script that indicates the Shell to be used:
#!/bin/bash # alternative use for bash #!/usr/bin/env bash # frequently used shebangs #!/bin/sh #!/bin/ksh #!/bin/zsh #!/bin/dash
Running PowerShell Scripts
In order to directly run PowerShell® script code from a JS7 shell job script the recommended approach is to use a shebang like this:
#!/usr/bin/env pwsh Write-Output "Hello" Write-Output "world"
In addition, a PowerShell® script can be executed from a file that is in reach of the JS( Agent:
pwsh -NoLogo -NonInteractive -File some_powershell_script.ps1
Running Python Scripts
In order to directly run Python® script code from a JS7 shell job script the recommended approach is to use a shebang replacement like this:
#!/usr/bin/python print("Hello") print("world")
Alternatively a Python® script can be executed from a file that has to be located in reach of the JS7 Agent:
#!/usr/bin/bash python hello.py
Running Node.js JavaScript
In order to directly run Node.js® script code from a JS7 shell job script, the recommended approach is to use a shebang that runs Node.js® as the interpreter of the script like this:
#!/usr/bin/node var name = (process.env.name); var num = parseInt(process.env.num); console.log(name); console.log(num);
Alternatively, a Node.js® script can be executed from a file that is located within reach of the JS7 Agent that runs the job:
node /some/location/sample_Node.js
Windows
Running Shell Scripts
Any commands available from the Windows Shell can be used in a job script like this:
@echo off echo hello world hostname
This includes to call .bat and .cmd command files like this:
@echo off call C:\Documents\hello.bat call C:\Documents\world.cmd
Running PowerShell Scripts
In order to directly run PowerShell® script code from a JS7 shell job script the recommended approach is to use a shebang replacement like this:
@@setlocal enabledelayedexpansion & @@findstr/v \"^@@[fs].*&\" \"%~f0\" | powershell.exe -NonInteractive -Command - & exit !errorlevel!/b& Write-Output "Hello" Write-Output "world"
Note: PowerShell 5.1 frequently ships with the Windows OS and makes use of powershell.exe
. Later PowerShell releases use the pwsh.exe
binary.
In addition, a PowerShell® script can be executed from a file that is located in reach of the JS7 Agent:
powershell.exe -NoLogo -NonInteractive -File some_powershell_script.ps1
Running Python Scripts
Python can be invoked to execute script code like this:
@@setlocal enabledelayedexpansion & @@findstr/v \"^@@[fs].*&\" \"%~f0\" | python.exe - & exit !errorlevel!/b& print("Hello") print("world")
Alternatively a Python® script can be executed from a file that has to be located in reach of the JS7 Agent:
python.exe hello.py
Running Node.js JavaScript
In order to directly run Node.js® script code from a JS7 shell job script, the recommended approach is to use a shebang that runs Node.js® as the interpreter of the script like this:
@@setlocal enabledelayedexpansion & @@findstr/v \"^@@[fs].*&\" \"%~f0\" | node.exe - & exit !errorlevel!/b& var name = (process.env.name); var num = parseInt(process.env.num); console.log(name); console.log(num);
Explanation:
- If you consider this shebang replacement somewhat cryptic then add it to JS7 - Script Includes which are easily referenced from shell jobs, e.g. by using
::!include <name-of-script-include>
- The
node.exe
executable as available from the Node.js® installation is executed by the shebang.
In addition, a Node.js® script can be executed from a file located with the JS7 Agent that implements the job:
node.exe C:\Users\Documents\sample_Node.js
Accessing Arguments
Shell jobs access arguments from OS environment variables.
- Such variables are declared with the workflow.
- Shell jobs map workflow variables to environment variables for the job.
- Shell job scripts make use of environment variables.
Declaring Workflow Variables
Variables are declared by a workflow like this:
- Variables are specified by a name and data type. Optionally a default value is specified:
- Orders are forced to specify values for workflow variables that are not assigned a default value.
- Orders are free to overrule default values of given workflow variables.
Mapping Workflow Variables to Job Environment Variables
From the declared workflow variables jobs choose which variables to map to environment variables like this:
Using Environment Variables in Jobs
Jobs make use of environment variables in the job script. Depending on the OS in use the following syntax is used:
- Unix:
${<variable-name>}
or$<variable-name>
- Names of variables are case-sensitive.
- Windows:
%<variable-name>%
- Names of variables are case-insensitive.
- Names of variables are case-insensitive.
Examples:
#!/bin/bash echo "using workflow: $JS7_WORKFLOW_NAME" echo "running job: $JS7_JOB_NAME" echo "Business Date: $BUSINESS_DATE" echo "Flight Number: $FLIGHT_NUMBER"
echo using workflow: %JS7_WORKFLOW_NAME% echo running job: %JS7_JOB_NAME% echo Business Date: %BUSINESS_DATE% echo Flight Number: %FLIGHT_NUMBER%
#!/usr/bin/env pwsh echo "using workflow: $env:JS7_WORKFLOW_NAME" echo "running job: $env:JS7_JOB_NAME" echo "Business Date: $env:BUSINESS_DATE" echo "Flight Number: $env:FLIGHT_NUMBER"
#!/usr/bin/python import os print('using workflow: ', os.environ.get('JS7_WORKFLOW_NAME')) print('running job: ', os.environ.get('JS7_JOB_NAME')) print('Business Date: ', os.environ.get('BUSINESS_DATE')) print('Flight Number: ', os.environ.get('FLIGHT_NUMBER'))
#!/usr/bin/node console.log('using workflow: ' + process.env.JS7_WORKFLOW_NAME); console.log('running job: ' + process.env.JS7_JOB_NAME); console.log('Business Date: ' + process.env.BUSINESS_DATE); console.log('Flight Number: ' + process.env.FLIGHT_NUMBER);
Passing Variables
Jobs can pass variables to subsequent jobs and JS7 - Workflow Instructions like this:
- The JS7 Agent offers an environment variable JS7_RETURN_VALUES that holds the path to a temporary file.
- Jobs can append key/value pairs to the temporary file.
- On completion of the job the JS7 Agent will read the temporary file and will make related workflow variables available for subsequent jobs.
Examples:
#!/bin/bash SOME_VAR=$RANDOM echo "my_var=$SOME_VAR" >> $JS7_RETURN_VALUES
set SOME_VAR=%RANDOM% echo my_var=%SOME_VAR% >> %JS7_RETURN_VALUES%
#!/usr/bin/env pwsh $someVar = Get-Random "my_var=$someVar" | Out-File $env:JS7_RETURN_VALUES -Append
#!/usr/bin/python import random; someVar = random.randint(0,9) with open(os.environ.get('JS7_RETURN_VALUES'), 'a') as f: print(f"my_var={someVar}", file=f)
#!/usr/bin/node const fs = require('fs'); var someVar = Math.random(); fs.appendFile(process.env.JS7_RETURN_VALUES, 'my_var=' + someVar + '\n', (err) => {});
Further Resources
How To
- JS7 - How to run Node.js JavaScript from Shell Jobs
- JS7 - How to run PowerShell scripts from jobs
- JS7 - How to run Python scripts from jobs
Links
How To ... Shell Jobs
How To ... Shell API