如何在 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) 第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文件中。为什么会这样呢?还有什么替代方案呢?
这里已经有很多这样的问题,但每个人都推荐(一种变体)以下解决方案:
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.profile,但这是可以与克服source ~/.profile的script自身script启动一些其他的(二进制)程序究竟会持续至CTRL-Cscript我必须得到相同的bash(相同的$BASHPID(因为需要运行另一个脚本取决于它)总之需要模拟如下交互工作:
screenecho $BASHPID/path/to/script经过以上,以后,我可以做
screen -ARR) …set -x或set -v打印每个执行的命令。
如何在命令开始执行时打印命令?
我有 anaconda python 发行版,~/anaconda/bin/python但是我可以使用什么 shebang 来调用这个版本的 python 而不是服务器上默认的旧版本?
# /opt/python/bin/python2.7是我一直在尝试的
我正在使用 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) 在工作中,我们有一个旧的 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) 我正在尝试自动化开关命令。这几乎一切都很好,但是当期望脚本从包含我的 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) 我通过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 循环中,我想将内容重定向到变量文件名中。
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 循环中的输出重定向到变量文件名?