From 4db185b15b291ccc99675c69a51934bb3f9825fd Mon Sep 17 00:00:00 2001 From: Felipe Pina Date: Tue, 19 May 2020 06:32:05 -0300 Subject: [PATCH 1/6] =?UTF-8?q?Adiciona=20op=C3=A7=C3=A3o=20para=20usar=20?= =?UTF-8?q?o=20id=20do=20usu=C3=A1rio=20no=20escalonamento=20de=20jobs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit + Usa o usuário de submissão do comando para executar o job nos escalonadores dos drivers do PBS e Slurm + A chave na qual o id do usuário é informado é a `csbase_command_user_id` + Somente é usado o id do usuário se na configuração do driver o valor da chave `allow_proxy_user` for `true` [SOMA-4463[SOMA-4553] --- sga/driver/pbs.lua | 4 ++-- sga/driver/slurm.lua | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/sga/driver/pbs.lua b/sga/driver/pbs.lua index da1d18a..22ff4a1 100644 --- a/sga/driver/pbs.lua +++ b/sga/driver/pbs.lua @@ -32,8 +32,8 @@ function pbs.execute_command(self, job, cmd_string) if self.pbs_queue then optional_params = optional_params.." -q "..self.pbs_queue end - if self.allow_proxy_user and job.parameters.pbs_user then - optional_params = optional_params.." -P "..job.parameters.pbs_user + if self.allow_proxy_user and (job.parameters.pbs_user or job.parameters.csbase_command_user_id) then + optional_params = optional_params.." -P "..(job.parameters.pbs_user or job.parameters.csbase_command_user_id) end for _, sandbox_path in ipairs(job.sandboxes) do diff --git a/sga/driver/slurm.lua b/sga/driver/slurm.lua index bdb5ebd..835b2c0 100644 --- a/sga/driver/slurm.lua +++ b/sga/driver/slurm.lua @@ -45,19 +45,19 @@ function slurm.execute_command(self, job, cmd_string) local optional_params = "" if self.slurm_init_dir then - optional_params = optional_params.."-D "..self.slurm_init_dir.." " + optional_params = optional_params.." -D "..self.slurm_init_dir end -- O equivalente de queue no slurm é partição! if self.slurm_queue then - optional_params = optional_params.."-p "..self.slurm_queue.." " + optional_params = optional_params.." -p "..self.slurm_queue end - if self.allow_proxy_user and job.parameters.slurm_user then - optional_params = optional_params.."--uid="..job.parameters.slurm_user.." " + if self.allow_proxy_user and (job.parameters.slurm_user or job.parameters.csbase_command_user_id) then + optional_params = optional_params.." --uid="..(job.parameters.slurm_user or job.parameters.csbase_command_user_id) end self.exec:write_file(script_filename, "#!/bin/sh\n"..cmd_string.."\n") - local full_cmd = ("%s --parsable -o %s -e %s %s%s"):format(cmds.sbatch, out_filename, err_filename, optional_params, script_filename) + local full_cmd = ("%s --parsable -o %s -e %s %s %s"):format(cmds.sbatch, out_filename, err_filename, optional_params, script_filename) self.logger:debug("[COMMAND] "..full_cmd) local slurmjid, stderr = self.exec:run(full_cmd) -- GitLab From be9cef8052ade115e9662908cd6a78edfc08d269 Mon Sep 17 00:00:00 2001 From: Felipe Pina Date: Wed, 20 May 2020 08:23:40 -0300 Subject: [PATCH 2/6] =?UTF-8?q?Modifica=20a=20leitura=20das=20configura?= =?UTF-8?q?=C3=A7=C3=B5e=20dos=20drivers=20PBS=20e=20Slurm?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit + Somente a tabela `driver_config` do arquivo de configuração será usada para configurar os drivers do PBS e Slurm. As configurações em `driver_config.pbs_config` e `driver_config.slurm_config` não serão mais consideradas as tabelas de configuração dos respectivos drivers [SOMA-4463[SOMA-4553] --- sga/driver/pbs.lua | 2 +- sga/driver/slurm.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sga/driver/pbs.lua b/sga/driver/pbs.lua index 22ff4a1..812d8f4 100644 --- a/sga/driver/pbs.lua +++ b/sga/driver/pbs.lua @@ -363,7 +363,7 @@ function pbs.new(config, logger) end -- Read optional pbs configuration - local pbs_config = (config.driver_config and config.driver_config.pbs_config) or {} + local pbs_config = config.driver_config or {} if pbs_config then local pbs_config_schema = schema.Record { init_dir = schema.Optional(schema.String), diff --git a/sga/driver/slurm.lua b/sga/driver/slurm.lua index 835b2c0..cc750c5 100644 --- a/sga/driver/slurm.lua +++ b/sga/driver/slurm.lua @@ -325,7 +325,7 @@ function slurm.new(config, logger) end -- Read optional slurm configuration - local slurm_config = (config.driver_config and config.driver_config.slurm_config) or {} + local slurm_config = config.driver_config or {} if slurm_config then local slurm_config_schema = schema.Record { init_dir = schema.Optional(schema.String), -- GitLab From 44357f8faa79c6cf11b2b766558c5390bcb1150a Mon Sep 17 00:00:00 2001 From: Felipe Pina Date: Fri, 22 May 2020 08:59:52 -0300 Subject: [PATCH 3/6] =?UTF-8?q?Adiciona=20suporte=20a=20execu=C3=A7=C3=A3o?= =?UTF-8?q?=20de=20jobs=20como=20outro=20usu=C3=A1rio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Modificação do driver Slurm: + Executa o comando `sbatch` com `sudo` se a opção `allow_proxy_user` for definida como `true` + Nova opção `proxy_user_group` para informar o grupo Unix de execução do job -- usada em conjunção a opção `allow_proxy_user` + Adição do comando `umask 002` no script gerado e submetido pelo SGA ao Slurm para que arquivos e diretórios gerados pela execução do job sejam criados com permissão de leitura a escrita para o grupo + Atualização da documentação [SOMA-4463[SOMA-4553] --- docs/index.rst | 72 ++++++++++++++++++++++++-------------------- sga/driver/slurm.lua | 19 ++++++++++-- 2 files changed, 55 insertions(+), 36 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index 4209e91..8800f6c 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -52,7 +52,8 @@ Requisitos + LuaRocks 2.4.2 (ou mais recente) + git -**Somente para instalações no Microsoft Windows:** use o próprio Cygwin para gerenciar as dependências, com exceção do LuaRocks, que deve ser instalado conforme instruções em https://luarocks.org/. +.. attention:: + **Somente para instalações no Microsoft Windows:** use o próprio Cygwin para gerenciar as dependências, com exceção do LuaRocks que deve ser instalado conforme instruções em https://luarocks.org/. Instalação ---------- @@ -71,13 +72,16 @@ Extrair o conteúdo do arquivo usando o comando ``tar``: $ tar -xzf sgarest-daemon-X.Y.X.tar.gz -**Somente para instalações no Microsoft Windows:** execute os seguintes comandos LuaRocks antes de iniciar a instalação: +.. attention:: + Para instalar somente para o usuário corrente use a opção ``--local`` nos comandos ``luarocks``. -.. code-block:: console +.. attention:: + **Somente para instalações no Microsoft Windows:** execute os seguintes comandos LuaRocks antes de iniciar a instalação: - $ luarocks install xml CC=g++ LD=g++ - $ luarocks install luaposix LDFLAGS=-no-undefined + .. code-block:: console + $ luarocks install xml CC=g++ LD=g++ + $ luarocks install luaposix LDFLAGS=-no-undefined Execute os comandos abaixo para instalar o módulo principal do SGA: @@ -94,7 +98,7 @@ POSIX $ luarocks make sga-driver-posix-*.rockspec -PBS (experimental) +PBS .. code-block:: console @@ -108,14 +112,6 @@ Slurm (experimental) $ luarocks make sga-exec-*.rockspec $ luarocks make sga-driver-slurm-*.rockspec -Instalação local ao usuário corrente -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Para instalar somente para o usuário corrente use a opção ``--local`` nos comandos ``luarocks``. - -.. - TODO Colocar essa mensagem como nota de roda pé e fazer referencia em todos os trecho com uso de luarocks acima. - Instalação sem conexão com a Internet ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -129,13 +125,12 @@ Se a instalação for feita em uma máquina sem acesso a Internet, pode-se pegar Instalação usando proxy ^^^^^^^^^^^^^^^^^^^^^^^ -Para instações realizadas em máquina usando proxy para conexão à Internet siga as instruções disponóveies em https://github.com/luarocks/luarocks/wiki/LuaRocks-through-a-proxy. - -Desinstalação -^^^^^^^^^^^^^ +Para instalações realizadas em máquina usando proxy para conexão à Internet siga as instruções disponíveis em https://github.com/luarocks/luarocks/wiki/LuaRocks-through-a-proxy. .. TODO Como desistalar o SGA e o LuaRocks -- e Lua se for o caso + Desinstalação + ^^^^^^^^^^^^^ Configuração ^^^^^^^^^^^^ @@ -209,7 +204,7 @@ Configuração de múltiplos SGAs Na configuração de múltiplos SGAs é possível definir valores *default* de parâmetros no início do arquivo e sobrescrever esses valores (ou adicionar parâmetros que estão sem *default*) em cada SGA definido. Essa configuração é útil por exemplo quando é necessário gerenciar mais de uma fila de um cluster. -Cada configuração particutar a um SGA deve ser adicionado na chave ``sgas`` do arquivo de configuração, no formato: +Cada configuração particular a um SGA deve ser adicionado na chave ``sgas`` do arquivo de configuração, no formato: .. code-block:: lua @@ -289,11 +284,11 @@ sga.driver.pbs Driver para gerencia de comandos em clusters através do TORQUE PBS. Testado com a versåo `2.5.12 `_. As seguintes configurações estão disponíveis: init_dir - Diretório de trabalhado para de execução dos comandos. Recomendado usar o valor ``os.getenv("PWD")`` (qsub -d) + Diretório de trabalhado para de execução dos comandos. Recomendado usar o valor ``os.getenv("PWD")`` (``qsub -d``) queue - Fila de execução do job. Um SGA apenas gerencia uma única fila. Para gerenciar múltiplas filas é necessário utilizar múltiplos SGAs (qsub -q) + Fila de execução do job. Um SGA apenas gerencia uma única fila. Para gerenciar múltiplas filas é necessário utilizar múltiplos SGAs (``qsub -q``) allow_proxy_user - Ativa o uso do ``proxy user``, fazendo que os comandos sejam executados no cluster usando o mesmo usuário que fez a submissão no servidor CSBase. O valor padrão é ``false``. (qsub -P) + Ativa o uso do ``proxy user``, fazendo que os comandos sejam executados no cluster usando o mesmo usuário que fez a submissão no servidor CSBase. O valor padrão é ``false``. (``qsub -P``) .. code-block:: lua @@ -308,11 +303,13 @@ sga.driver.slurm Driver para gerencia de comandos em clusters através do Slurm. Testado com a versão `20.02 `_. As seguintes configurações estão disponíveis: init_dir - Diretório de trabalhado para de execução dos comandos. . Recomendado usar o valor ``os.getenv("PWD")`` (sbatch -D) + Diretório de trabalhado para de execução dos comandos. . Recomendado usar o valor ``os.getenv("PWD")`` (``sbatch -D``) queue - Fila de execução do job. b. Um SGA apenas gerencia uma única fila. Para gerenciar múltiplas filas é necessário utilizar múltiplos SGA (sbatch -p) + Fila de execução do job. b. Um SGA apenas gerencia uma única fila. Para gerenciar múltiplas filas é necessário utilizar múltiplos SGA (``sbatch -p``) allow_proxy_user - Ativa o uso do ``proxy user``, fazendo que os comandos sejam executados no cluster usando o mesmo usuário que fez a submissão no servidor CSBase. O valor padrão é ``false``. (sbatch --uid) + Ativa o uso do ``proxy user``, fazendo que os comandos sejam executados no cluster usando o mesmo usuário que fez a submissão no servidor CSBase. O valor padrão é ``false``. (``sbatch --uid``) + proxy_user_group + Grupo a ser usado quando a opção ``allow_proxy_user`` estiver ativa. Assim a submissão do comando será feita em nome do usuário solicitante e usando o grupo informado. O valor padrão é o grupo padrão do usuário que executa o SGA. (``sbatch --gid``) .. code-block:: lua @@ -321,10 +318,19 @@ sga.driver.slurm init_dir = os.getenv("HOME").."/forecast", queue = "weather", allow_proxy_user = true, + proxy_user_group = "forecasters", } - - -Drivers que usam a biblioteca ``sga-exec`` podem configurá-la para fazer o dispáro remoto de comandos usando o protoco SSH. Segue trecho da configuração: + + Ao ativar a opção ``allow_proxy_user`` é preciso adicionar o usuário que executa o SGA ao arquivo ``/etc/sudoers``, pois para usar os argumentos ``--uid`` e ``--gid`` do comando ``sbatch`` esse usuário precisa de permissão ``root``. Além disso não deve-se solicitar sua senha ao executar o comando ``sbatch``. Segue exemplo: + .. code-block:: + + sga_user ALL=(ALL) ALL + sga_user ALL=(ALL) NOPASSWD: /bin/sbatch + + .. caution:: + Somente faça alterações no arquivo ``/etc/sudoers`` através do utilitário ``visudo``. + +Drivers que usam a biblioteca ``sga-exec`` podem configurá-la para fazer o disparo remoto de comandos usando o protocolo SSH. Segue trecho da configuração: .. code-block:: lua @@ -336,7 +342,7 @@ Drivers que usam a biblioteca ``sga-exec`` podem configurá-la para fazer o disp } } -Lembrando que é necessårio ativar a autenticação por chave publica, sem senha, do usuário na máquina. Veja `Public Key authentication for SSH `_ para mais detalhes. +Lembrando que é necessário ativar a autenticação por chave publica, sem senha, do usuário na máquina. Veja `Public Key authentication for SSH ` para mais detalhes. Mecanismos de transferências """""""""""""""""""""""""""" @@ -402,7 +408,7 @@ Para visualizar as propriedades processadas pelo SGA existe a flag ``--debug``: $ ./sgad.sh sgad.cfg --sga_name garoa --debug -Verificando a instalação ------------------------- - -Em breve. +.. + TODO Adicionar sessão com instruções para verificação da instalação + Verificando a instalação + ------------------------ diff --git a/sga/driver/slurm.lua b/sga/driver/slurm.lua index cc750c5..87e7b32 100644 --- a/sga/driver/slurm.lua +++ b/sga/driver/slurm.lua @@ -32,6 +32,8 @@ function slurm.execute_command(self, job, cmd_string) local script_filename = self.config.runtime_data_dir.."/sbatch_"..job.jid..".script" local out_filename = self.config.runtime_data_dir.."/sbatch_"..job.jid..".out" local err_filename = self.config.runtime_data_dir.."/sbatch_"..job.jid..".err" + local sudo_cmd = "sudo " + local as_root = false for _, sandbox_path in ipairs(job.sandboxes) do local ok, err = self.exec:create_dir(sandbox_path) @@ -52,12 +54,21 @@ function slurm.execute_command(self, job, cmd_string) optional_params = optional_params.." -p "..self.slurm_queue end if self.allow_proxy_user and (job.parameters.slurm_user or job.parameters.csbase_command_user_id) then - optional_params = optional_params.." --uid="..(job.parameters.slurm_user or job.parameters.csbase_command_user_id) + local gid_param = " --gid=" + if self.proxy_user_group then + gid_param = gid_param..self.proxy_user_group + else + gid_param = gid_param.."$(id -g)" + optional_params = optional_params.." --uid="..(job.parameters.slurm_user or job.parameters.csbase_command_user_id)..gid_param + as_root = true end - self.exec:write_file(script_filename, "#!/bin/sh\n"..cmd_string.."\n") + -- Add umask at top of the script to ensure that all files created during the + -- job's execution could be modified by the unix group members + self.exec:write_file(script_filename, "#!/bin/sh\numask 002\n"..cmd_string.."\n") - local full_cmd = ("%s --parsable -o %s -e %s %s %s"):format(cmds.sbatch, out_filename, err_filename, optional_params, script_filename) + local cmd_prefix = as_root and sudo_cmd or "" + local full_cmd = ("%s%s --parsable -o %s -e %s %s %s"):format(cmd_prefix, cmds.sbatch, out_filename, err_filename, optional_params, script_filename) self.logger:debug("[COMMAND] "..full_cmd) local slurmjid, stderr = self.exec:run(full_cmd) @@ -331,6 +342,7 @@ function slurm.new(config, logger) init_dir = schema.Optional(schema.String), queue = schema.Optional(schema.String), allow_proxy_user = schema.Optional(schema.Boolean), + proxy_user_group = schema.Optional(schema.String), } local err = schema.CheckSchema(slurm_config, slurm_config_schema) if err then @@ -346,6 +358,7 @@ function slurm.new(config, logger) slurm_init_dir = slurm_config.init_dir or nil, slurm_queue = slurm_config.queue or nil, allow_proxy_user = slurm_config.allow_proxy_user or false, + proxy_user_group = slurm_config.proxy_user_group or nil, } return self end -- GitLab From f231e5dbdd678da5f51f7d9dd3a2e7bb418b5661 Mon Sep 17 00:00:00 2001 From: Felipe Pina Date: Mon, 25 May 2020 06:58:35 -0300 Subject: [PATCH 4/6] =?UTF-8?q?Adiciona=20suporte=20a=20execu=C3=A7=C3=A3o?= =?UTF-8?q?=20de=20jobs=20como=20outro=20usu=C3=A1rio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit + Corrige driver Slurm [SOMA-4463[SOMA-4553] --- sga/driver/slurm.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/sga/driver/slurm.lua b/sga/driver/slurm.lua index 87e7b32..62bb033 100644 --- a/sga/driver/slurm.lua +++ b/sga/driver/slurm.lua @@ -59,6 +59,7 @@ function slurm.execute_command(self, job, cmd_string) gid_param = gid_param..self.proxy_user_group else gid_param = gid_param.."$(id -g)" + end optional_params = optional_params.." --uid="..(job.parameters.slurm_user or job.parameters.csbase_command_user_id)..gid_param as_root = true end -- GitLab From 97a696e1243b38e236bfea4a18e43fc6f809c1bb Mon Sep 17 00:00:00 2001 From: Felipe Pina Date: Mon, 25 May 2020 10:21:22 -0300 Subject: [PATCH 5/6] =?UTF-8?q?Desfaz=20altera=C3=A7=C3=A3o=20na=20leitura?= =?UTF-8?q?=20das=20configura=C3=A7=C3=B5es=20dos=20drivers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit + As configurações dos driver PBS e Slurm são definidas nas sub-tabelas `pbs_config` e `slurm_config` respectivamente + Atualiza documentação de configuração dos drivers PBS e Slurm [SOMA-4463[SOMA-4553] --- docs/index.rst | 24 ++++++++++++++---------- sga/driver/pbs.lua | 2 +- sga/driver/slurm.lua | 2 +- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index 8800f6c..ed633e9 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -279,9 +279,9 @@ Os driver do SGA são responsáveis por acessar o recurso oferecidos pelo SGA. E Segue breve descrição de cada driver, com exemplos de configurações: sga.driver.posix - Driver para gerencia de comandos usando sistemas operacionais compatíveis com POSIX. Não possui configurações específicas + Driver para gerência de comandos usando sistemas operacionais compatíveis com POSIX. Não possui configurações específicas sga.driver.pbs - Driver para gerencia de comandos em clusters através do TORQUE PBS. Testado com a versåo `2.5.12 `_. As seguintes configurações estão disponíveis: + Driver para gerência de comandos em clusters através do TORQUE PBS. Testado com a versåo `2.5.12 `_. As seguintes configurações opcionais podem ser definidas em ``pbs_config``: init_dir Diretório de trabalhado para de execução dos comandos. Recomendado usar o valor ``os.getenv("PWD")`` (``qsub -d``) @@ -294,13 +294,15 @@ sga.driver.pbs driver = "sga.driver.pbs" driver_config = { - init_dir = os.getenv("HOME").."/forecast", - queue = "weather", - allow_proxy_user = false, + pbs_config = { + init_dir = os.getenv("HOME").."/forecast", + queue = "weather", + allow_proxy_user = false, + } } sga.driver.slurm - Driver para gerencia de comandos em clusters através do Slurm. Testado com a versão `20.02 `_. As seguintes configurações estão disponíveis: + Driver para gerência de comandos em clusters através do Slurm. Testado com a versão `20.02 `_. As seguintes configurações opcionais podem ser definidas em ``slurm_config``: init_dir Diretório de trabalhado para de execução dos comandos. . Recomendado usar o valor ``os.getenv("PWD")`` (``sbatch -D``) @@ -315,10 +317,12 @@ sga.driver.slurm driver = "sga.driver.slurm" driver_config = { - init_dir = os.getenv("HOME").."/forecast", - queue = "weather", - allow_proxy_user = true, - proxy_user_group = "forecasters", + slurm_config = { + init_dir = os.getenv("HOME").."/forecast", + queue = "weather", + allow_proxy_user = true, + proxy_user_group = "forecasters", + } } Ao ativar a opção ``allow_proxy_user`` é preciso adicionar o usuário que executa o SGA ao arquivo ``/etc/sudoers``, pois para usar os argumentos ``--uid`` e ``--gid`` do comando ``sbatch`` esse usuário precisa de permissão ``root``. Além disso não deve-se solicitar sua senha ao executar o comando ``sbatch``. Segue exemplo: diff --git a/sga/driver/pbs.lua b/sga/driver/pbs.lua index 812d8f4..22ff4a1 100644 --- a/sga/driver/pbs.lua +++ b/sga/driver/pbs.lua @@ -363,7 +363,7 @@ function pbs.new(config, logger) end -- Read optional pbs configuration - local pbs_config = config.driver_config or {} + local pbs_config = (config.driver_config and config.driver_config.pbs_config) or {} if pbs_config then local pbs_config_schema = schema.Record { init_dir = schema.Optional(schema.String), diff --git a/sga/driver/slurm.lua b/sga/driver/slurm.lua index 62bb033..0a42e92 100644 --- a/sga/driver/slurm.lua +++ b/sga/driver/slurm.lua @@ -337,7 +337,7 @@ function slurm.new(config, logger) end -- Read optional slurm configuration - local slurm_config = config.driver_config or {} + local slurm_config = (config.driver_config and config.driver_config.slurm_config) or {} if slurm_config then local slurm_config_schema = schema.Record { init_dir = schema.Optional(schema.String), -- GitLab From 9cde55a871fe80ff325a81ff5ef281aa811d5cce Mon Sep 17 00:00:00 2001 From: Felipe Pina Date: Tue, 26 May 2020 11:06:46 -0300 Subject: [PATCH 6/6] Adiciona o comando `umask 002` no script gerado pelo driver PBS MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit + O script gerado e submetido pelo SGA ao PBS executa primeiramente o comando `umask 002` para que arquivos e diretórios gerados pela execução do job sejam criados com permissão de leitura a escrita para o grupo [SOMA-4463[SOMA-4553] --- sga/driver/pbs.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sga/driver/pbs.lua b/sga/driver/pbs.lua index 22ff4a1..f79a6db 100644 --- a/sga/driver/pbs.lua +++ b/sga/driver/pbs.lua @@ -46,7 +46,7 @@ function pbs.execute_command(self, job, cmd_string) self.exec:chmod(sandbox_path, "rwxrwxrwx") end - self.exec:write_file(script_filename, "#!/bin/sh\n"..cmd_string.."\n") + self.exec:write_file(script_filename, "#!/bin/sh\numask 002\n"..cmd_string.."\n") local full_cmd = ("%s -N %s -V -o %s -e %s %s %s"):format(cmds.qsub, job.cmd_id, out_filename, err_filename, optional_params, script_filename) self.logger:debug("[COMMAND] "..full_cmd) -- GitLab