raw implementation
This commit is contained in:
parent
a0c87eafff
commit
390429de87
6 changed files with 300 additions and 0 deletions
189
.gitignore
vendored
Normal file
189
.gitignore
vendored
Normal file
|
@ -0,0 +1,189 @@
|
||||||
|
|
||||||
|
# Created by https://www.gitignore.io/api/osx,node,linux,macos,windows,visualstudiocode
|
||||||
|
# Edit at https://www.gitignore.io/?templates=osx,node,linux,macos,windows,visualstudiocode
|
||||||
|
|
||||||
|
### Linux ###
|
||||||
|
*~
|
||||||
|
|
||||||
|
# temporary files which can be created if a process still has a handle open of a deleted file
|
||||||
|
.fuse_hidden*
|
||||||
|
|
||||||
|
# KDE directory preferences
|
||||||
|
.directory
|
||||||
|
|
||||||
|
# Linux trash folder which might appear on any partition or disk
|
||||||
|
.Trash-*
|
||||||
|
|
||||||
|
# .nfs files are created when an open file is removed but is still being accessed
|
||||||
|
.nfs*
|
||||||
|
|
||||||
|
### macOS ###
|
||||||
|
# General
|
||||||
|
.DS_Store
|
||||||
|
.AppleDouble
|
||||||
|
.LSOverride
|
||||||
|
|
||||||
|
# Icon must end with two \r
|
||||||
|
Icon
|
||||||
|
|
||||||
|
# Thumbnails
|
||||||
|
._*
|
||||||
|
|
||||||
|
# Files that might appear in the root of a volume
|
||||||
|
.DocumentRevisions-V100
|
||||||
|
.fseventsd
|
||||||
|
.Spotlight-V100
|
||||||
|
.TemporaryItems
|
||||||
|
.Trashes
|
||||||
|
.VolumeIcon.icns
|
||||||
|
.com.apple.timemachine.donotpresent
|
||||||
|
|
||||||
|
# Directories potentially created on remote AFP share
|
||||||
|
.AppleDB
|
||||||
|
.AppleDesktop
|
||||||
|
Network Trash Folder
|
||||||
|
Temporary Items
|
||||||
|
.apdisk
|
||||||
|
|
||||||
|
### Node ###
|
||||||
|
# Logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
lerna-debug.log*
|
||||||
|
|
||||||
|
# Diagnostic reports (https://nodejs.org/api/report.html)
|
||||||
|
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
||||||
|
|
||||||
|
# Runtime data
|
||||||
|
pids
|
||||||
|
*.pid
|
||||||
|
*.seed
|
||||||
|
*.pid.lock
|
||||||
|
|
||||||
|
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||||
|
lib-cov
|
||||||
|
|
||||||
|
# Coverage directory used by tools like istanbul
|
||||||
|
coverage
|
||||||
|
*.lcov
|
||||||
|
|
||||||
|
# nyc test coverage
|
||||||
|
.nyc_output
|
||||||
|
|
||||||
|
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
|
||||||
|
.grunt
|
||||||
|
|
||||||
|
# Bower dependency directory (https://bower.io/)
|
||||||
|
bower_components
|
||||||
|
|
||||||
|
# node-waf configuration
|
||||||
|
.lock-wscript
|
||||||
|
|
||||||
|
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
||||||
|
build/Release
|
||||||
|
|
||||||
|
# Dependency directories
|
||||||
|
node_modules/
|
||||||
|
jspm_packages/
|
||||||
|
|
||||||
|
# TypeScript v1 declaration files
|
||||||
|
typings/
|
||||||
|
|
||||||
|
# TypeScript cache
|
||||||
|
*.tsbuildinfo
|
||||||
|
|
||||||
|
# Optional npm cache directory
|
||||||
|
.npm
|
||||||
|
|
||||||
|
# Optional eslint cache
|
||||||
|
.eslintcache
|
||||||
|
|
||||||
|
# Optional REPL history
|
||||||
|
.node_repl_history
|
||||||
|
|
||||||
|
# Output of 'npm pack'
|
||||||
|
*.tgz
|
||||||
|
|
||||||
|
# Yarn Integrity file
|
||||||
|
.yarn-integrity
|
||||||
|
|
||||||
|
# dotenv environment variables file
|
||||||
|
.env
|
||||||
|
.env.test
|
||||||
|
|
||||||
|
# parcel-bundler cache (https://parceljs.org/)
|
||||||
|
.cache
|
||||||
|
|
||||||
|
# next.js build output
|
||||||
|
.next
|
||||||
|
|
||||||
|
# nuxt.js build output
|
||||||
|
.nuxt
|
||||||
|
|
||||||
|
# react / gatsby
|
||||||
|
public/
|
||||||
|
|
||||||
|
# vuepress build output
|
||||||
|
.vuepress/dist
|
||||||
|
|
||||||
|
# Serverless directories
|
||||||
|
.serverless/
|
||||||
|
|
||||||
|
# FuseBox cache
|
||||||
|
.fusebox/
|
||||||
|
|
||||||
|
# DynamoDB Local files
|
||||||
|
.dynamodb/
|
||||||
|
|
||||||
|
### OSX ###
|
||||||
|
# General
|
||||||
|
|
||||||
|
# Icon must end with two \r
|
||||||
|
|
||||||
|
# Thumbnails
|
||||||
|
|
||||||
|
# Files that might appear in the root of a volume
|
||||||
|
|
||||||
|
# Directories potentially created on remote AFP share
|
||||||
|
|
||||||
|
### VisualStudioCode ###
|
||||||
|
.vscode/*
|
||||||
|
!.vscode/settings.json
|
||||||
|
!.vscode/tasks.json
|
||||||
|
!.vscode/launch.json
|
||||||
|
!.vscode/extensions.json
|
||||||
|
|
||||||
|
### VisualStudioCode Patch ###
|
||||||
|
# Ignore all local history of files
|
||||||
|
.history
|
||||||
|
|
||||||
|
### Windows ###
|
||||||
|
# Windows thumbnail cache files
|
||||||
|
Thumbs.db
|
||||||
|
Thumbs.db:encryptable
|
||||||
|
ehthumbs.db
|
||||||
|
ehthumbs_vista.db
|
||||||
|
|
||||||
|
# Dump file
|
||||||
|
*.stackdump
|
||||||
|
|
||||||
|
# Folder config file
|
||||||
|
[Dd]esktop.ini
|
||||||
|
|
||||||
|
# Recycle Bin used on file shares
|
||||||
|
$RECYCLE.BIN/
|
||||||
|
|
||||||
|
# Windows Installer files
|
||||||
|
*.cab
|
||||||
|
*.msi
|
||||||
|
*.msix
|
||||||
|
*.msm
|
||||||
|
*.msp
|
||||||
|
|
||||||
|
# Windows shortcuts
|
||||||
|
*.lnk
|
||||||
|
|
||||||
|
# End of https://www.gitignore.io/api/osx,node,linux,macos,windows,visualstudiocode
|
38
bin/iexec
Executable file
38
bin/iexec
Executable file
|
@ -0,0 +1,38 @@
|
||||||
|
#!/usr/bin/env node
|
||||||
|
const program = require('commander');
|
||||||
|
const Exec = require('../lib/index');
|
||||||
|
|
||||||
|
function myParseInt(value, dummyPrevious) {
|
||||||
|
// parseInt takes a string and an optional radix
|
||||||
|
if (!value) return 1000;
|
||||||
|
return parseInt(value);
|
||||||
|
}
|
||||||
|
function args(value, previous) {
|
||||||
|
if (!previous) previous === [];
|
||||||
|
return [...previous, value];
|
||||||
|
}
|
||||||
|
program.version('iexec v0.0.1, Made with ♥️ by Sagi Dayan');
|
||||||
|
|
||||||
|
program.option('-c, --command <command>', 'Command to execute wrapped in', null)
|
||||||
|
.option('-a, --arg [arg]', 'Arguments for the command', args, [])
|
||||||
|
.option(
|
||||||
|
'-i, --interval [milliseconds]', 'Interval milliseconds', myParseInt,
|
||||||
|
1000)
|
||||||
|
.option(
|
||||||
|
'-w, --wait', 'Wait until execution ends before running a new process',
|
||||||
|
false);
|
||||||
|
|
||||||
|
program.parse(process.argv);
|
||||||
|
console.log(program.args);
|
||||||
|
if (!program.command) {
|
||||||
|
console.error('Must provide a command to run. Use -c to pass a command');
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(program.wait);
|
||||||
|
|
||||||
|
const _needToWait = program.wait;
|
||||||
|
const _command = program.command;
|
||||||
|
const _args = program.arg;
|
||||||
|
const _interval = program.interval;
|
||||||
|
Exec.start(_command, _args, _needToWait, _interval);
|
36
lib/index.js
Normal file
36
lib/index.js
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
const {spawn} = require('child_process');
|
||||||
|
|
||||||
|
|
||||||
|
class Exec {
|
||||||
|
static start(command, args, needToWait, interval) {
|
||||||
|
let doneWithOld = true;
|
||||||
|
let numOfExecutions = 0;
|
||||||
|
console.log(`Running command '${command}' | Args: ${
|
||||||
|
JSON.stringify(
|
||||||
|
args)} | interval ${interval}ms | needToWait ${!!needToWait}`);
|
||||||
|
setInterval(() => {
|
||||||
|
if (needToWait && !doneWithOld) return;
|
||||||
|
doneWithOld = false;
|
||||||
|
numOfExecutions++;
|
||||||
|
const execNum = numOfExecutions;
|
||||||
|
console.log(`/******* Staring command #${execNum} ********/`);
|
||||||
|
const exec = spawn(command, args);
|
||||||
|
|
||||||
|
exec.stdout.on('data', (data) => {
|
||||||
|
console.log(`[${execNum}] ${data}`);
|
||||||
|
});
|
||||||
|
|
||||||
|
exec.stderr.on('data', (data) => {
|
||||||
|
console.error(`[${execNum}] ${data}`);
|
||||||
|
});
|
||||||
|
|
||||||
|
exec.on('close', (code) => {
|
||||||
|
console.log(`/******* Ended command #${execNum} ********/`);
|
||||||
|
doneWithOld = true;
|
||||||
|
});
|
||||||
|
}, interval);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
module.exports = Exec;
|
14
package-lock.json
generated
Normal file
14
package-lock.json
generated
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
{
|
||||||
|
"name": "iexec",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"lockfileVersion": 1,
|
||||||
|
"author": "Sagi Dayan",
|
||||||
|
"requires": true,
|
||||||
|
"dependencies": {
|
||||||
|
"commander": {
|
||||||
|
"version": "4.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/commander/-/commander-4.0.1.tgz",
|
||||||
|
"integrity": "sha512-IPF4ouhCP+qdlcmCedhxX4xiGBPyigb8v5NeUp+0LyhwLgxMqyp3S0vl7TAPfS/hiP7FC3caI/PB9lTmP8r1NA=="
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
15
package.json
Normal file
15
package.json
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
{
|
||||||
|
"name": "iexec",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"description": "Executes a command in intervals until interrupts",
|
||||||
|
"bin": "bin/iexec",
|
||||||
|
"main": "lib/index",
|
||||||
|
"scripts": {
|
||||||
|
"test": "echo \"Error: no test specified\" && exit 1"
|
||||||
|
},
|
||||||
|
"author": "Sagi Dayan",
|
||||||
|
"license": "ISC",
|
||||||
|
"dependencies": {
|
||||||
|
"commander": "^4.0.1"
|
||||||
|
}
|
||||||
|
}
|
8
yarn.lock
Normal file
8
yarn.lock
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||||
|
# yarn lockfile v1
|
||||||
|
|
||||||
|
|
||||||
|
commander@^4.0.1:
|
||||||
|
version "4.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/commander/-/commander-4.0.1.tgz#b67622721785993182e807f4883633e6401ba53c"
|
||||||
|
integrity sha512-IPF4ouhCP+qdlcmCedhxX4xiGBPyigb8v5NeUp+0LyhwLgxMqyp3S0vl7TAPfS/hiP7FC3caI/PB9lTmP8r1NA==
|
Loading…
Reference in a new issue