我尝试了这两种方法:
os.system("python test.py")
subprocess.Popen("python test.py", shell=True)
Run Code Online (Sandbox Code Playgroud)
两种方法都需要等到test.py完成才能阻止主进程.我知道"nohup"可以胜任这项工作.是否有Python方法来启动test.py或任何其他shell脚本并让它在后台运行?
假设test.py是这样的:
for i in range(0, 1000000):
print i
Run Code Online (Sandbox Code Playgroud)
os.system()或subprocess.Popen()都将阻止主程序,直到显示1000000行输出.我想要的是让test.py以静默方式运行并仅显示主程序输出.当test.py仍在运行时,主程序可能会安静.
我一直在使用它作为参考,但无法完全满足我的需求:在Python中调用外部命令
我也在读这篇文章:http://www.python.org/dev/peps/pep-3145/
对于我们的项目,在部署应用程序之前,我们需要更新5个svn签出.在我的开发环境中,快速部署对于生产力而言比生产部署更重要,我一直在努力加快这一过程.
我有一个bash脚本,一直运作得体,但有一些限制.我使用以下bash命令启动多个'svn updates':
(svn update /repo1) & (svn update /repo2) & (svn update /repo3) &
Run Code Online (Sandbox Code Playgroud)
这些都是并行运行的,效果很好.我还在构建脚本的其余部分中使用此模式来触发每个ant构建,然后将战争移动到Tomcat.
但是,如果其中一个更新或构建失败,我无法控制停止部署.
我正在用Python重写我的bash脚本,所以我可以更好地控制分支和部署过程.
我正在使用subprocess.call()来触发'svn update/repo'命令,但每个命令都按顺序执行.我尝试'(svn update/repo)&'然后全部触发,但结果代码立即返回.因此,在异步模式下,我无法确定特定命令是否失败.
import subprocess
subprocess.call( 'svn update /repo1', shell=True )
subprocess.call( 'svn update /repo2', shell=True )
subprocess.call( 'svn update /repo3', shell=True )
Run Code Online (Sandbox Code Playgroud)
我很想找到一种方法让Python启动每个Unix命令,并且如果任何调用在任何时候整个脚本停止都失败了.
我们必须使用delayed_job(或其他一些后台作业处理器)在后台运行作业,但我们不允许更改服务器上的启动脚本/启动级别.这意味着如果提供程序重新启动服务器,则不保证守护程序仍然可用(因为守护程序将由每个部署仅运行一次的capistrano配方启动).
目前,我能够想到确保delayed_job守护程序始终运行的最佳方法是向我们的Rails应用程序添加初始化程序,以检查守护程序是否正在运行.如果它没有运行,那么初始化器启动守护进程,否则,它就会离开它.
因此,问题是我们如何检测到Delayed_Job守护程序是从脚本内部运行的?(我们应该能够相当容易地启动一个守护进程,我不知道如何检测一个守护进程是否已经激活).
有人有主意吗?
此致,伯尼
基于下面的答案,这就是我提出的.只需将它放在config/initializers中就可以了:
#config/initializers/delayed_job.rb
DELAYED_JOB_PID_PATH = "#{Rails.root}/tmp/pids/delayed_job.pid"
def start_delayed_job
Thread.new do
`ruby script/delayed_job start`
end
end
def process_is_dead?
begin
pid = File.read(DELAYED_JOB_PID_PATH).strip
Process.kill(0, pid.to_i)
false
rescue
true
end
end
if !File.exist?(DELAYED_JOB_PID_PATH) && process_is_dead?
start_delayed_job
end
Run Code Online (Sandbox Code Playgroud) ruby ruby-on-rails background-process ruby-on-rails-plugins delayed-job
我基本上问的问题与Spawn中的后台进程相同,除了我需要在Windows环境中生成后台进程!不幸的是,我的研究表明Windows不支持Ruby分支(只有勺子.Rimshot!).
capistrano任务
namespace :service do
desc "start daemontools (svscan/supervise/svscanboot)"
task :start, :roles => :app do
sudo "svscanboot&"
end
end
Run Code Online (Sandbox Code Playgroud)
现在这不起作用:svscanboot进程根本不运行.这帮助我找到sleep:https://github.com/defunkt/resque/issues/284
其他来源向我指出nohup,redirection和pty => true,所以我尝试了所有这些.
run "nohup svscanboot >/tmp/svscanboot.log 2>&1 &" # NO
run "(svscanboot&) && sleep 1" # NO
run "(nohup svscanboot&) && sleep 1" # YES!
Run Code Online (Sandbox Code Playgroud)
现在,任何人都可以向我解释为什么我需要睡眠声明和nohup有什么区别?对于记录,如果从用户shell运行,上述所有内容同样运行良好,问题仅出现在capistrano的上下文中.
谢谢
我正在使用expect在我的服务器上启动一个应用程序:
#!/usr/bin/expect
set timeout -1
spawn "bin/start-all.sh"
expect {
-re "Found MongoDB in" { send "y\r"; exp_continue }
-re "Found Hadoop in" { send "y\r"; exp_continue }
-re "Going to start Hadoop" { interact }
}
Run Code Online (Sandbox Code Playgroud)
我可以在脚本运行的几秒钟内访问我的服务器上的应用程序,但是一旦它结束,应用程序就会变得不可用.
我在调试模式下运行expect并在结束时获得以下输出:
expect: does "vendors area. Do you want to start it? [y/n] y\r\n" (spawn_id exp6) match regular expression "Found MongoDB in"? Gate "Found MongoDB in"? gate=no
"Found Hadoop in "? Gate "Found Hadoop in "? gate=no
"Going to start Hadoop"? Gate "Going to …Run Code Online (Sandbox Code Playgroud) 我正在尝试通过后台获取从url获取数据.我的func尝试获取数据,如果有新数据,它会发送本地通知.当我最小化应用程序时,后台提取工作大约10 - 20分钟后工作.但是,当我杀了应用程序(双击主页按钮并关闭应用程序)它不起作用.我等了大约1个小时但是没用.我在android中使用后台服务,它正在成功运行.有没有办法从网址获取数据并在应用关闭时发送本地通知?我正在使用Xcode 6和swift 1.2
我有一些由supervisord管理的Python工作者,如果他们正常工作,应该连续打印到stdout(在每个完成的任务之后).但是,他们往往会挂起,我们很难找到错误.理想情况下,supervisord会注意到它们没有在X分钟内打印并重新启动它们; 任务是幂等的,所以不优雅的重启很好.是否有任何supervisord功能或插件可以做到这一点?或者是另一个类似管理员的程序,开箱即用?
我们已经在使用http://superlance.readthedocs.io/en/latest/memmon.html来杀死内存使用量突然增加,这可以缓解一些挂起,但是一个不会导致内存泄漏的挂起仍然会导致工人达到停顿状态.
即使app没有运行,我也想在后台运行我的计时器.因为我希望在一段时间间隔后得到用户的gps坐标.这样做的方法是什么?
在我的网络应用程序中,我对长时间运行的任务执行操作,并且我想在后台调用此任务。因此,根据文档 .NET Core 3.1排队后台任务,我使用这样的代码:
public interface IBackgroundTaskQueue
{
ValueTask QueueBackgroundWorkItemAsync(Func<CancellationToken, ValueTask> workItem);
ValueTask<Func<CancellationToken, ValueTask>> DequeueAsync(CancellationToken cancellationToken);
}
public class BackgroundTaskQueue : IBackgroundTaskQueue
{
private readonly Channel<Func<CancellationToken, ValueTask>> _queue;
public BackgroundTaskQueue(int capacity)
{
var options = new BoundedChannelOptions(capacity){FullMode = BoundedChannelFullMode.Wait};
_queue = Channel.CreateBounded<Func<CancellationToken, ValueTask>>(options);
}
public async ValueTask QueueBackgroundWorkItemAsync(Func<CancellationToken, ValueTask> workItem)
{
if (workItem == null)throw new ArgumentNullException(nameof(workItem));
await _queue.Writer.WriteAsync(workItem);
}
public async ValueTask<Func<CancellationToken, ValueTask>> DequeueAsync(CancellationToken cancellationToken)
{
var workItem = await _queue.Reader.ReadAsync(cancellationToken);
return workItem;
}
}
Run Code Online (Sandbox Code Playgroud)
和托管服务
public …Run Code Online (Sandbox Code Playgroud) python ×2
ruby ×2
shell ×2
.net ×1
.net-core ×1
asynchronous ×1
capistrano ×1
delayed-job ×1
expect ×1
fork ×1
ios ×1
iphone ×1
linux ×1
objective-c ×1
self-hosting ×1
supervisord ×1
swift ×1
tcl ×1
unix ×1
windows ×1
worker ×1