标签: bash

在 cronjob 中加载用户环境变量

如何在 cronjob 中加载用户环境变量?


我有一个 cronjob,它应该在我的 Ubuntu 机器上每分钟启动一个脚本:

* * * * * /home/user/myscript.sh;
Run Code Online (Sandbox Code Playgroud)

在此脚本中,我想使用 和 等环境变量$JAVA_HOME$M2_HOME自动启动构建过程。问题是这些变量是在.bashrcvia中设置的export JAVA_HOME=/../..

source因此,在执行我的脚本之前我需要这些文件:

* * * * * source ~/.bash_profile; source ~/.bashrc; /home/user/myscript.sh;
Run Code Online (Sandbox Code Playgroud)

但是,变量尚未设置!为了测试这一点,我将echo环境变量添加env到日志文件中:

env >> ~/env.log
echo $M2_HOME >> ~/env.log
Run Code Online (Sandbox Code Playgroud)

日志文件仍然不包含变量。仅将以下内容附加到文件中(无$M2_HOME等):

LANGUAGE=en_US:en
HOME=/home/user
LOGNAME=user
PATH=/usr/bin:/bin
LANG=en_US.UTF-8
SHELL=/bin/sh
PWD=/home/user
Run Code Online (Sandbox Code Playgroud)

如果我在 shell 中运行脚本,所有变量都会打印到env.log.

source当我将命令放入脚本文件中时,也会发生同样的情况。仅当我export在变量声明之前删除关键字时,命令才可以看到该关键字echo $var。但这不是解决方案,因为我不管理这些声明。


我尝试了@tripplee的解决方案与有限的sh shell问题,但它仍然不起作用。我进一步将其简化为一个非常简单的 cronjob,无需第二个脚本来显示问题:

* * * * * . …
Run Code Online (Sandbox Code Playgroud)

ubuntu bash environment-variables cron

5
推荐指数
1
解决办法
2万
查看次数

命令“getent”

第1部分

应该getent是可执行文件吗?

在我的 zsh 设置中,我可以看到 getent 实际上被定义为一个函数

$ which getent   
getent () {
    if [[ $2 = <-> ]]
    then
        grep ":$2:[^:]*$" /etc/$1
    else
        grep "^$2:" /etc/$1
    fi
}
Run Code Online (Sandbox Code Playgroud)

如果我想从 bash shell 执行它,

bash -c  "getent passwd user"  
Run Code Online (Sandbox Code Playgroud)

我收到一个getent: command not found错误。

第2部分

在 Mac OSX 中,getent无论用户 ID 是否有效,都会失败。事实证明用户 ID 没有保存在/etc/passwd文件中。为什么会这样呢?还有什么替代方案呢?

bash zsh mac-osx passwd

5
推荐指数
1
解决办法
6801
查看次数

运行分离的屏幕会话但没有在同一个 bash 中终止

这里已经有很多这样的问题,但每个人都推荐(一种变体)以下解决方案:

screen -dmS somename bash -c "/path/to/script; bash -l"
Run Code Online (Sandbox Code Playgroud)

例如,当script结束时,运行一个新的bash.

不幸的是,这对我不起作用,因为

  • script$BASHPID 变量用于某事
  • script运行始终运行,如需要使用CTRL-C终止它
  • 终止后,我必须具有运行相同的外壳script(相同$BASHPID

所以,问题是:

  • 如何screen在分离模式下启动(例如在启动时) - 通常这是由-dm
  • 它必须启动shell
    • 最好的,如果它可以启动它的“登陆”的外壳,如什么读我的.profile,但这是可以与克服source ~/.profilescript自身
    • script启动一些其他的(二进制)程序究竟会持续至CTRL-C
  • 并且在终止之后script我必须得到相同的bash(相同的$BASHPID(因为需要运行另一个脚本取决于它)

总之需要模拟如下交互工作:

  • 开始 screen
  • echo $BASHPID
  • 在屏幕内运行一些命令(最后一个运行直到 CTRL-C) - 例如运行 /path/to/script
  • 分离 (ctrl-a d)

经过以上,以后,我可以做

  • 重新连接 ( screen -ARR) …

shell bash gnu-screen

5
推荐指数
1
解决办法
1481
查看次数

使用时间戳回显每个 shell 脚本命令

set -xset -v打印每个执行的命令。

如何在命令开始执行时打印命令?

shell bash shell-scripting

5
推荐指数
2
解决办法
3189
查看次数

我的服务器目录中的 Anaconda Python 有何作用

我有 anaconda python 发行版,~/anaconda/bin/python但是我可以使用什么 shebang 来调用这个版本的 python 而不是服务器上默认的旧版本?

# /opt/python/bin/python2.7是我一直在尝试的

scripting unix python bash

5
推荐指数
2
解决办法
1万
查看次数

Bash 命令在终端运行,但不在 Jenkins/Bash 脚本中运行

我正在使用 Jenkins 构建 HTML 文档并将其部署到本地 Apache Web 服务器以供我们的开发人员使用。当我在终端中运行命令时,一切都安装正确(证明服务器设置正确)。但是,当从 Jenkins 内部运行相同的命令时,它们会被调用但没有任何变化。它不会删除html.zip(第 18 行),不会将文件移动到 中/var/html/www/subdir,并且不会报告curl请求失败之外的任何错误。我对我做错了什么有点迷茫。

我应该注意,我将整个脚本称为sudo. 我知道这是不安全的,但我想我会先尝试让脚本工作,然后再更改。为了确保user在安装文档时不会遇到问题,我暂时允许它以 sudo 身份运行任何命令而无需密码。同样,我知道这是不安全的,但本着试图消除变量的精神,我添加了这个。

Jenkins 像这样调用这个脚本: sudo ./documentation-publisher.sh

目前对脚本的权限限制最少,777。调用ls -l脚本报告: -rwxrwxrwx 1 devop developers 1144 Dec 3 10:29 documentation-publisher.sh

我尝试了这篇文章中关于在脚本中显式设置路径的建议,但没有发现任何差异。使用的每个命令的显式路径也不会改变行为。

#!/bin/sh -x

echo "Archiving generated HTML for transfer..."
cd Example/docs/html/
zip -r html.zip ./
scp -i ~/.ssh/id_rsa html.zip user@my.host.example.com:/home/user 
ssh -i ~/.ssh/id_rsa user@my.host.example.com 

echo "Extracting generated HTML into www directory..."
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
unzip -o …
Run Code Online (Sandbox Code Playgroud)

scripting bash web-server documentation jenkins

5
推荐指数
1
解决办法
1万
查看次数

奇怪的行为 ssh -&gt; bash --&gt; (tty no echo) --&gt; c 程序?

在工作中,我们有一个旧的 C 程序,它与霍尼韦尔的工业手持终端一起工作。

该终端有自己的 ssh 客户端来连接到 linux redhat 6.6 服务器。一旦它连接到 linux box(使用某个用户),bash shell 就会启动一个 C 程序,并带有以下参数

export TERM=vt200
stty raw icrnl -echo
$APLI_EXEC/program param1 param2
Run Code Online (Sandbox Code Playgroud)

所以流程就像 => 客户端 ssh --> ssh 服务器-> bash --> c 程序

应用程序(或看起来)运行良好,但有时(每周 1-3-5 次)随机终端停止从服务器接收数据,但应用程序接收来自服务器的输入。就像在 shell 中编写 Ctrl+S 一样。

使用 strace 调试应用程序和 ssh 进程时,我意识到一些奇怪的事情:

应用程序 strace 很好

write(1, "1", 7) = 1
Run Code Online (Sandbox Code Playgroud)

但是 ssh 过程的 strace 不好(我认为..是的,我看到 ioctl 没有 echo 参数,但是...)

rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
read(3, "\227\316\242\350\261\330)\300e\210\352\367\2VX\24\305\2474\272\371\34\273n{\323p.\211\17H\327"..., 16384) …
Run Code Online (Sandbox Code Playgroud)

debug ssh bash

5
推荐指数
1
解决办法
400
查看次数

预期脚本太快:在从文件读取的每一行之间添加睡眠

我正在尝试自动化开关命令。这几乎一切都很好,但是当期望脚本从包含我的 switch 命令的文件中读取每一行(逐行列出)时,开关似乎在大约 10 或 15 个命令后停止,我认为缓冲区太小了。

如何在从文件读取的每个命​​令之间添加睡眠?谢谢!!

set fp [open "/home/room.txt" r]
set data [read $fp]

set timeout -60
spawn telnet 10.91.60.14
match_max 100000
sleep 2
expect *
send -- "^Y"
sleep 2
send -- "password\r"
sleep 2
send -- "^[\[A"
send -- "^[\[A"
send -- "\r"
sleep 1
send -- "enable\r"
send -- "configure terminal\r"
sleep 1
expect *
sleep 2
**send -- "$data"**
sleep 2
interact
Run Code Online (Sandbox Code Playgroud)

scripting linux bash switch expect

5
推荐指数
1
解决办法
5万
查看次数

如何设置 TeamCity Command Line Runner 默认 shell?

我通过init.d如下脚本在 Ubuntu 15.10 上启动我的 TeamCity 代理:

#!/bin/sh
### BEGIN INIT INFO
# Provides:          TeamCity Build Agent
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start build agent daemon at boot time
# Description:       Enable service provided by daemon.
### END INIT INFO

USER="myuser"

case "$1" in
  start)
    su - $USER -c "/home/myuser/BuildAgent/bin/agent.sh start"
  ;;
  stop)
    su - $USER -c "/home/myuser/BuildAgent/bin/agent.sh stop"
  ;;
  *)
    echo "usage …
Run Code Online (Sandbox Code Playgroud)

bash teamcity init.d

5
推荐指数
0
解决办法
3073
查看次数

Bash for 循环将输出重定向到变量文件名

在下面的 bash 循环中,我想将内容重定向到变量文件名中。

for i in {1..22};do echo $i > $i_output.txt; done
Run Code Online (Sandbox Code Playgroud)

不幸的是,这些文件没有创建。我最初想做的是 grep 文件中的染色体并为每个染色体创建一个文件。但这不太可测试:

for i in {1..22}; grep -E "[a-z]+[0-9]+\t$i\t" rawdata.txt > $i_chr.txt;done
Run Code Online (Sandbox Code Playgroud)

我们如何将 for 循环中的输出重定向到变量文件名?

bash

5
推荐指数
1
解决办法
1万
查看次数