我正在制作一个小的 shell 脚本,在启动后启动各种程序。我用于dialog制作菜单,然后制作运行所需应用程序的简单 case 语句。除了我最喜欢的 Chromium 浏览器之外,一切都很完美。
nohup chromium &不起作用 - 当我关闭终端时 Chromium 也会关闭。
这是我的脚本:
selection=`dialog --menu "Choose a session:" 20 50 10 "Surfing" "" "Surfing (blank)" "" "Programming" "" "Gaming" "" "Nothing" "" --stdout`
case "$selection" in
"Surfing" )
nohup chromium http://www.facebook.com &
nohup chromium http://www.twitter.com &
nohup chromium http://reader.google.com &
nohup chromium http://plus.google.com &
nohup chromium http://www.youtube.com &
nohup chromium http://www.reddit.com &
nohup chromium http://mail.google.com &
nohup sonata &
mpc play &
;;
"Surfing (blank)" …Run Code Online (Sandbox Code Playgroud) 在使用redhat中的旧脚本时,我遇到了类似的行
daemon --user $USER --pidfile $PIDFILE "cmd >>/var/log/cmd.log 2>&1 &"
它似乎是可疑的,因为它不使用nohup.但是程序正常工作,即使退出控制终端也能保持运行.进一步调查我发现,bash -c 'sleep 1000&'即使调用它的终端退出(例如,没有nohup也不可能),命令例如似乎保持不变.我用最新的ubuntu验证了这种行为.
所以我的问题是,这种行为是众所周知的吗?也就是说,我可以在我的init脚本中使用它而不是使用nohup吗?或者它是bash中的错误?
我有一个脚本,用于ssh登录远程机器、cd特定目录,然后启动守护程序。原始脚本如下所示:
ssh server "cd /tmp/path ; nohup java server 0</dev/null 1>server_stdout 2>server_stderr &"
Run Code Online (Sandbox Code Playgroud)
此脚本似乎工作正常。但是,对于用户输入错误路径导致cd失败的情况并不稳健。由于 ,即使失败;,此命令也会尝试运行该nohup命令cd。
明显的修复不起作用:
ssh server "cd /tmp/path && nohup java server 0</dev/null 1>server_stdout 2>server_stderr &"
Run Code Online (Sandbox Code Playgroud)
也就是说,SSH 命令在服务器停止之前不会返回。放在nohup前面cd而不是前面java没有用。
谁能帮我解决这个问题?你能解释为什么这个解决方案不起作用吗?谢谢!
编辑: cbuckley 建议使用sh -c,我从中得出:
ssh server "nohup sh -c 'cd /tmp/path && java server 0</dev/null 1>master_stdout 2>master_stderr' 2>/dev/null 1>/dev/null &"
Run Code Online (Sandbox Code Playgroud)
但是,现在退出代码总是0在cd失败时;而如果我这样做了,ssh server cd /failed/path …
我正在尝试从dreamhost到另一台主机进行rsync备份,这是我想要使用的命令:
nohup rsync -e"/ usr/bin/ssh"--bwlimit = 2000 -av username@server.dreamhost.com:remote_directory local_directory&
我希望这个过程能够在后台继续运行,即使我断开连接也是如此.问题是,我不知道如何在后台进程时输入密码.我该怎么做呢?
我需要使用 nohup 传递一个参数来使用 bash 启动一个 python 脚本,该参数有助于在我导入的脚本中定义一个常量。关于传递 args 有很多问题,但我还没有找到使用 nohup 的成功方法。
我的 bash 脚本的简化版本:
#!/bin/bash
BUCKET=$1
echo $BUCKET
script='/home/path/to/script/script.py'
echo "starting $script with nohup"
nohup /usr/bin/python $script $BUCKET &
Run Code Online (Sandbox Code Playgroud)
我正在导入的配置脚本的相关部分:
FLAG = sys.argv[0]
if FLAG == "b1":
AWS_ACCESS_KEY_ID = "key"
BUCKET = "bucket1"
AWS_SECRET_ACCESS_KEY = "secret"
elif FLAG == "b2":
AWS_ACCESS_KEY_ID = "key"
BUCKET = "bucket2"
AWS_SECRET_ACCESS_KEY = "secret"
else:
AWS_ACCESS_KEY_ID = "key"
BUCKET = "bucket3"
AWS_SECRET_ACCESS_KEY = "secret"
Run Code Online (Sandbox Code Playgroud)
使用它的脚本:
from config import BUCKET, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY
#do stuff with the …Run Code Online (Sandbox Code Playgroud) 我有一个可以在Linux和Mac OS X上运行的bash脚本。脚本的某一行与Linux中的一样,但在OS X中不起作用。
nohup <utility> <arg> > output.txt 2> error.txt </dev/null &
Run Code Online (Sandbox Code Playgroud)
当bash脚本在Linux中运行时,它就像一个超级按钮。但是,在OS X中运行bash脚本时,出现错误
nohup: can't detach from console: Inappropriate ioctl for device
Run Code Online (Sandbox Code Playgroud)
我已经做了很多搜索,但是还没有找到合适的答案来说明为什么这样。
正在执行的脚本早于退出<utility>,这就是为什么(据我所知)我需要使用的原因nohup。但是,我已经进行了一些测试,nohup从bash脚本的行中删除似乎可以解决问题,因为这两个系统上的实用程序都将启动,并且即使脚本退出后仍可以继续运行。
我通常使用:
nohup python -u myscript.py &> ./mylog.log & # or should I use nohup 2>&1 ? I never remember
Run Code Online (Sandbox Code Playgroud)
启动一个后台 Python 进程,即使我退出,我也想继续运行该进程,并且:
ps aux |grep python
# check for the relevant PID
kill <relevantPID>
Run Code Online (Sandbox Code Playgroud)
它有效,但执行所有这些步骤很烦人。
我已经阅读了一些需要将 PID 保存在某个文件中的方法,但这更麻烦。
是否有一种干净的方法可以轻松启动/停止 Python 脚本?喜欢:
startpy myscript.py # will automatically continue running in
# background even if I log out
# two days later, even if I logged out / logged in again the meantime
stoppy myscript.py
Run Code Online (Sandbox Code Playgroud)
或者这个长的部分nohup python -u myscript.py &> …
在后台启动Python进程时,用
nohup python myscript.py > test.log 2>&1 < /dev/null &
Run Code Online (Sandbox Code Playgroud)
问题是stdout缓冲:数据不是实时写入的test.log.以常见的解决办法这个问题是定时冲洗用sys.stdout.flush(),甚至更好,因为提出这个答案,使用python -u:
nohup python -u myscript.py > test.log 2>&1 < /dev/null &
Run Code Online (Sandbox Code Playgroud)
但这还不够.我注意到它在几个小时内工作,然后,它停止工作,即几个小时后test.log不再实时写入,即使我使用过nohup python -u ....
1)这是如何重现问题(我有一个标准的Debian Jessie).启动此文件:
import time
import datetime
while True:
print datetime.datetime.now()
time.sleep(60)
Run Code Online (Sandbox Code Playgroud)
与nohup python -u myscript.py > test.log 2>&1 < /dev/null &.日志文件将在几个小时内更新,然后在3或4小时后更新,不再有任何内容.
2)如何解决这个问题,而不必stdout.flush()在代码中插入每两行(丑陋的解决方案)?
我有一个非常简单的 bash 脚本。我希望这个 bash 脚本在我从终端注销后继续运行,因为它正在监视一些服务。但是,我遇到的问题是,一旦我退出终端,进程就会终止。
我运行这个过程:
nohup ./test.sh > test.log &
Run Code Online (Sandbox Code Playgroud)
我使用以下方法检查过程:
ps -aux | grep test.sh
Run Code Online (Sandbox Code Playgroud)
当我运行该进程时,我会检查脚本是否正在运行。但是,当我重新连接时,脚本不再运行。
test.sh文件内容如下:
#!/bin/bash
while :
do
echo `date`": ****** Scheduled Test *****"
result1=$(wget "127.0.0.1" -q -O -)
result2=$(wget "127.0.0.1" -q -O -)
echo ": $result1"
echo ": $result2"
if [[ $result1 == *"Running OK"* ]] && [[ $result2 == *"Running OK"* ]];
then
echo "***** Running OK ***** :)"
sleep 60
continue
fi
echo "@@@@@ Not Running @@@@@"
echo "-----> Killing JARS"
kill …Run Code Online (Sandbox Code Playgroud) 我在服务器上编写了一个烧瓶应用程序.我像下面这样运行: -
export FLASK_APP=mypyhthonfile
nohup flask run --host=host-ip --port=port-number
Run Code Online (Sandbox Code Playgroud)
python脚本具有以下记录器语句:
Logger.info("this is a log")
Run Code Online (Sandbox Code Playgroud)
记录器语句同时打印在logger文件和nohup.out中
避免在nohup.out中打印记录器语句的方法是什么?